会员认证与账号管理
# 会员认证与账号管理
schema v21 提供独立会员账号、会话与凭据。会员登录不继承后台用户的角色、部门、菜单或管理 API 权限;同名账号、同数值 ID 或相同设备标签都不能跨身份域授权。当前提供管理员创建账号后的口令认证、本人注销及已绑定身份的OIDC入口;会员商城、积分和公开自注册另行扩展。OIDC与认证模式见提供方管理、认证模式和原生验收客户端。
# 开通与管理
先使用当前 CLI 显式迁移。平台给租户套餐配置 identity.members 能力;升级不会向已有套餐自动加权。迁移在缺失时登记 member-web 浏览器口令客户端;如果 v20 已预登记同名客户端,则保留原版本、启停与 grant。原记录仍是授权码或已停用时,密码入口继续拒绝,需要平台按实际接入方案维护配置,不能靠升级自动开通。
租户后台的“会员账号”需要 member:user:read。新增、修改和重置分别需要 member:user:create、member:user:update、member:user:reset;新增和重置还要求保留租户管理员使用本人现有口令再鉴别。只读角色须显式分配会员菜单和读取权限,页面不显示写按钮,API 也独立检查当前权限。
会员账号以小写字母开头,只含小写字母、数字、点、下划线和连字符,最多 64 字符。用户名创建后不改,展示名最多 100 字符。会员属于当前管理员的租户,表单不接受 tenantId、角色或后台用户 ID。会员不计入后台管理用户配额;这不代表已提供会员业务配额。
新建与重置均要求显式提供新口令,不产生默认密码。口令满足当前租户策略,UTF-8 总字节数不超过 72;只存 bcrypt 散列。会员首次登录必须改密,成功后退出全部会员设备并重新登录。页面提交、取消和卸载均清空两个口令输入,不自动重发敏感写。
编辑使用当前版本。409001 表示冲突,关闭编辑器并刷新列表再核对,不自动覆盖。启停、会话撤销与管理审计在同一事务提交;恢复账号不复活旧 token。重置清除会员密码锁定、推进密码与账号版本并撤销全部会话,但保留账号原启停状态。审计失败全部回滚;再鉴别失败仍提交管理员失败计数和失败审计。
# 会员客户端接入
会员认证接口固定为 /api/member/v1,使用独立 member 刷新 Cookie。浏览器写请求要求已配置的可信 Origin、X-App-Request: member 和 JSON;生产经统一 JWE 内容加密与请求防重放。Vben 后台仍使用 admin/platform 内存会话;会员业务客户端不得把会员 access 填进后台登录状态。
| 接口 | 行为 |
|---|---|
POST /api/member/v1/auth/login | 提交 tenantCode、clientId、username、password;可选 deviceId/deviceLabel |
POST /api/member/v1/auth/refresh | 正文 {},从 HttpOnly Cookie 取一次性 refresh |
POST /api/member/v1/auth/logout | 正文 {},撤销对应会话并清除会员 Cookie |
PUT /api/member/v1/profile/password | currentPassword/newPassword;受限会话也可使用 |
DELETE /api/member/v1/profile/me | currentPassword、confirm=true;正常会员本人注销,成功清除会员 Cookie |
GET /api/member/v1/auth/me | 返回本人 realm、audience、subjectType/subjectId、tenantId、clientId 和安全资料 |
GET /api/member/v1/auth/sessions | 读取本人有效会话,不返回设备指纹或凭据 |
DELETE /api/member/v1/auth/sessions/{id} | 正文 {},只撤销本人指定设备 |
DELETE /api/member/v1/auth/sessions | 正文 {},撤销本人所有 client 会话 |
登录必须使用 member 域内启用的 web/password 客户端,不能借用 admin-web、platform-web、原生授权码或服务凭证。访问与刷新期限、会话上限沿用 身份客户端与设备会话 的上限规则。deviceId 只保存散列,设备标签仅展示,不作为可信认证因素。
每次认证、刷新和本人写操作都复核主库租户/套餐能力、会员状态、密码版本、会话期限和 client 版本。客户端配置变化、账号停用恢复、租户停用恢复或改密后,旧凭据不能重新生效。自然口令到期会持久转为强制改密,后续放宽自然有效期也不会解除已经发生的限制。
refresh 成功消费后保留旧摘要以检测重放;旧 refresh 重放会撤销该会话。401001 仅表示其余身份条件仍有效、单纯 access 到期,客户端最多刷新一次。401002 必须重新登录;403003 只允许改密、刷新和退出。数据库或策略依赖故障拒绝本次请求,不把可重试故障写成永久撤销。
# 本人注销
注销前必须完成首次/重置或到期改密,并持有当前有效的正常会员 access。向 DELETE /api/member/v1/profile/me 显式提交本人 currentPassword 和 confirm: true;不传目标会员、租户或客户端 ID。请求仍遵守上述 Origin、内容加密和防重放规则。客户端应在提交前明确提示账号将终止,成功后清除本地 access 并回到登录页;失败不自动重发。
服务在同一事务中重新验证账号、租户、会话、client 与本人密码,将账号设为终止墓碑、清空旧密码散列、推进账号及密码版本、撤销所有 client 会话并写入 member 域认证审计。错误密码会提交失败计数,达到当前阈值锁定并撤销会话;审计故障整体回滚。旧 access、refresh、缓存 Principal、管理员启用或重置均不能恢复终止账号;再次使用旧凭据注销返回 401002,原 refresh 退出仍幂等成功。
活动会员管理列表不再显示已终止账号。管理员可按原创建规则同名重建,但获得新主体 ID,仍须首次改密,不能继承历史会话;外部绑定尚未接入,后续仍须按主体 ID 隔离。历史账号、管理事件和认证审计继续保留,不代表姓名、设备资料或其他个人数据已经物理删除;个人数据清理、保留期限与已绑定外部身份的终止规则须在相应能力接入时另行实现。
# 管理接口与边界
| 接口 | 权限与输入 |
|---|---|
GET /api/admin/v1/identity/members | read;pageNo/pageSize,最多 100 条 |
POST /api/admin/v1/identity/members | create;username/displayName/password/operatorPassword |
PUT /api/admin/v1/identity/members/{id} | update;displayName/status/version |
POST /api/admin/v1/identity/members/{id}/reset-password | reset;password/operatorPassword/version |
跨租户目标统一不可见。客户端提供的租户覆盖头被拒绝;管理 API 不接受会员 token,会员 API 也不接受后台或平台 token。公开自注册、会员业务资料、渠道登录、原生PKCE与真实IdP SSO仍未提供。独立机器身份另见服务账号与scope。
数据库升级、协议与页面验证记录见 M5 实施记录。Cookie、Origin 与 JWE 的通用规则见 登录与会话。
会员外部主体可由当前租户管理员显式绑定;精确 issuer/sub、注销墓碑与解绑保留规则见 OIDC提供方与外部绑定。当前绑定管理不会替换会员口令或自动开通 SSO 登录。
管理员创建会员账号(口令与 operatorPassword 由操作者提供,响应不返回散列):
POST /api/admin/v1/identity/members
Origin: http://127.0.0.1:5174
X-App-Request: admin
Authorization: Bearer <access>
Content-Type: application/json
{
"username": "member01",
"displayName": "会员甲",
"password": "<操作者提供>",
"operatorPassword": "<操作者提供>"
}