Skip to content

认证授权 PRD

文档信息

项目内容
产品名称PMForge - 认证授权
文档版本v2.0
创建日期2026-09-11
最后更新2026-09-24
文档状态评审中
优先级P0

一、功能概述

1.1 功能定位

认证授权是 PMForge 平台的安全大门——它回答两个核心问题:"你是谁?"和"你能做什么?"。

  • 认证(Authentication):验证用户身份,确保"你是你声称的那个人"。支持账号密码、手机验证码、社交账号、扫码等多种方式。
  • 授权(Authorization):基于认证结果发放访问令牌(Token),控制用户在系统内能访问哪些资源、执行哪些操作。

本模块是 PMForge 所有业务功能的前置依赖——没有认证授权,用户无法进入系统,一切功能无从谈起。

1.2 目标用户

用户类型使用场景核心诉求
C端用户通过手机号/社交账号快速登录无需记忆密码,一键登录
B端企业用户账号密码登录后台管理系统安全可靠,支持 SSO 单点登录
系统管理员管理 OAuth2 应用、社交登录配置、查看安全日志灵活配置,安全可控
第三方开发者通过 OAuth2 协议接入 PMForge标准协议,接入简单

1.3 业务价值

  • 多方式登录:覆盖账号密码、手机验证码、社交账号、扫码等主流登录方式,兼顾安全性和便捷性
  • 安全防护:密码加密存储、登录失败锁定、验证码防刷、IP 黑名单等多层防护机制
  • 开放生态:标准 OAuth2 协议支持,允许第三方应用安全接入
  • 审计合规:完整的登录日志和操作记录,满足安全审计和合规要求
  • 多租户隔离:认证体系天然支持多租户架构,不同租户的用户数据完全隔离

1.4 功能范围

功能分类后台管理端前台用户端说明
账号密码登录最基础的登录方式
手机号验证码登录免密码快速登录
社交账号登录微信/QQ/钉钉等第三方登录
扫码登录手机扫码登录 PC 端
用户注册新用户自助注册
密码找回忘记密码自助重置
修改密码已登录状态修改密码
图形验证码防机器人验证
OAuth2 应用管理管理第三方接入应用
社交客户端配置配置社交平台接入参数
登录日志查看登录安全记录
在线用户管理查看/踢出在线用户

二、用户场景

2.1 用户角色

角色描述核心诉求
普通用户C 端个人用户快速登录、安全便捷、不记密码
企业用户B 端租户用户账号密码登录、SSO 单点登录
系统管理员后台管理人员管理 OAuth2 应用、配置社交登录、查看安全日志
第三方开发者外部系统接入方标准 OAuth2 协议接入、安全调用 API

2.2 使用场景

场景1:企业员工账号密码登录(日常最高频)

  • 用户:企业员工小王
  • 场景:早上打开电脑 -> 访问 PMForge 后台 -> 输入用户名和密码 -> 拖动滑块完成验证码 -> 点击登录 -> 进入系统首页
  • 期望:登录过程 < 3 秒完成;支持"记住密码"减少输入;密码输错时有明确提示
  • 异常处理:密码连续输错 5 次 -> 账号锁定 30 分钟 -> 显示"账号已锁定,请 30 分钟后重试或联系管理员"

场景2:C端用户手机号验证码登录

  • 用户:新用户小李
  • 场景:打开 App -> 选择"手机号登录" -> 输入手机号 -> 点击"获取验证码" -> 收到 6 位数字短信 -> 输入验证码 -> 登录成功
  • 期望:验证码 5 秒内收到;60 秒倒计时防重复发送;手机号未注册时自动创建账号
  • 异常处理:验证码输错 3 次 -> 需要重新获取;验证码 10 分钟过期

场景3:微信社交账号一键登录

  • 用户:普通用户小张
  • 场景:打开登录页 -> 点击"微信登录"图标 -> 页面跳转到微信授权页 -> 扫码确认授权 -> 自动跳回 PMForge 并登录成功
  • 期望:首次社交登录自动创建账号并绑定微信;已绑定用户直接登录无需二次操作
  • 异常处理:微信已绑定其他账号 -> 提示"该微信已绑定账号 xxx,是否解绑?"

场景4:扫码登录(PC + 手机联动)

  • 用户:企业用户小陈
  • 场景:PC 端打开登录页 -> 点击"扫码登录" -> 屏幕显示二维码 -> 打开手机 App 扫码 -> 手机显示"确认在 PC 端登录?" -> 点击确认 -> PC 端自动跳转首页
  • 期望:二维码 2 分钟内有效;扫码后手机端显示 PC 端设备信息以便确认

场景5:密码找回

  • 用户:忘记密码的小刘
  • 场景:登录页点击"忘记密码" -> 输入注册手机号 -> 获取验证码 -> 输入验证码验证身份 -> 设置新密码(8-20 位,含字母和数字) -> 修改成功 -> 跳转登录页
  • 期望:整个流程 < 2 分钟完成;新密码不能与最近 3 次密码相同

场景6:第三方应用 OAuth2 接入

  • 用户:第三方开发者
  • 场景:在 PMForge 后台注册 OAuth2 应用 -> 获取 clientId 和 clientSecret -> 用户点击"使用 PMForge 登录" -> 跳转授权页 -> 用户同意授权 -> 回调获取 access_token -> 调用 PMForge API
  • 期望:标准 OAuth2 授权码流程;access_token 有效期可配置

场景7:管理员踢出异常在线用户

  • 用户:系统管理员
  • 场景:收到安全告警 -> 进入在线用户管理页面 -> 发现某账号在异常 IP 登录 -> 点击"踢出" -> 该用户立即下线
  • 期望:踢出后该用户 Token 立即失效;被踢出用户下次操作时提示"您的账号已被管理员强制下线"

2.3 用户故事与验收标准

编号用户故事优先级验收标准
US-01作为用户,我希望用账号密码登录,以便访问我的个人数据P01. 支持用户名/手机号/邮箱三种账号格式登录
2. 登录成功 < 500ms 返回 Token
3. 密码错误 5 次锁定 30 分钟
4. 登录成功/失败均记录日志
US-02作为用户,我希望用手机号验证码登录,以便无需记忆密码P01. 验证码 60 秒内发送成功
2. 验证码 10 分钟有效
3. 未注册手机号自动创建账号
4. 每天最多发送 10 次验证码
US-03作为用户,我希望用微信/QQ 登录,以便快速注册登录P11. 支持微信(PC 扫码/公众号/小程序)、QQ、钉钉等 6+ 平台
2. 首次社交登录自动创建账号并绑定
3. 已绑定用户一键登录
US-04作为用户,我希望忘记密码时能快速找回,以便继续使用系统P01. 支持手机号和邮箱两种找回方式
2. 全流程 < 2 分钟完成
3. 新密码不能与最近 3 次相同
US-05作为管理员,我希望管理 OAuth2 应用,以便控制第三方接入P11. 支持 CRUD 操作
2. clientId 全局唯一
3. 支持 4 种授权类型
4. 令牌有效期可配置
US-06作为管理员,我希望查看登录日志,以便进行安全审计P11. 支持按用户、IP、时间、结果筛选
2. 支持导出 Excel
3. 记录登录类型、IP 归属地、浏览器信息
US-07作为用户,我希望登录时有图形验证码,以保障账号安全P01. 支持滑块拼图/文字点选
2. 密码错误 3 次后强制要求验证码
3. 验证码类型可配置
US-08作为用户,我希望支持扫码登录,以便在移动端快速登录P21. 二维码 2 分钟有效
2. 手机端确认后才登录
3. PC 端实时感知扫码状态
US-09作为管理员,我希望管理在线用户,以便处理异常会话P21. 展示在线用户列表(IP、设备、登录时间)
2. 支持强制踢出
3. 踢出后 Token 立即失效
US-10作为用户,我希望修改密码后所有设备退出登录,以保障安全P01. 修改密码需验证当前密码
2. 修改成功后所有设备的 Token 失效
3. 新密码不能与最近 3 次相同

三、功能需求

3.1 后台管理端

3.1.1 功能清单

功能优先级权限标识说明
管理员登录P0管理员账号密码登录后台
OAuth2 应用管理P1system:oauth2-client:*管理第三方接入应用
OAuth2 令牌管理P1system:oauth2-token:*查看/管理访问令牌
社交客户端配置P1system:social-client:*配置微信/钉钉等社交平台
登录日志查看P1system:login-log:query查看登录安全记录
在线用户管理P2system:auth:kickout查看/踢出在线用户

3.1.2 管理员登录

页面描述:

  • 登录页面包含:系统 Logo、标题"PMForge 管理平台"、账号输入框、密码输入框、验证码区域、"登录"按钮
  • 底部:支持"记住我"复选框、"忘记密码"链接

业务规则:

规则编号规则描述
R-01账号支持三种格式输入:用户名、手机号、邮箱,系统自动识别
R-02密码连续错误 5 次,锁定账号 30 分钟(锁定期间即使密码正确也无法登录)
R-03验证码支持两种模式:滑块拼图、文字点选,可在后台配置
R-04首次登录或连续 3 次密码错误后,强制要求输入验证码
R-05登录成功/失败均自动记录登录日志(含 IP、浏览器、操作系统、登录结果)
R-06Token 默认有效期 2 小时,可通过配置调整
R-07"记住我"功能有效期默认 7 天,可通过配置调整
R-08登录成功后,前端保存 Token,后续所有请求携带 Token 进行身份验证

接口设计:

接口名称请求方式接口路径说明
管理员登录POST/admin-api/system/auth/login管理员登录获取 Token

请求参数:

参数名类型必填说明
usernameString用户名/手机号/邮箱
passwordString密码(前端加密传输)
captchaVerificationString验证码校验结果标识
rememberMeBoolean是否"记住我"(默认 false)

返回结果:

字段名类型说明
accessTokenString访问令牌,后续请求放入 Header Authorization: Bearer {accessToken}
refreshTokenString刷新令牌,accessToken 过期后用其换取新的 accessToken
expiresTimeLongaccessToken 过期时间(毫秒时间戳)

3.1.3 OAuth2 应用管理

页面描述:

  • 列表页:展示所有已注册的 OAuth2 应用,支持按应用名搜索,操作列包含编辑、删除
  • 新增/编辑页:表单包含应用名称、客户端 ID、客户端密钥、授权类型(多选)、重定向 URI(支持多个)、令牌有效期等

业务规则:

规则编号规则描述
R-01客户端 ID(clientId)全局唯一,创建后不可修改
R-02支持 4 种 OAuth2 授权类型:授权码模式、隐藏式、密码模式、客户端凭证模式
R-03重定向 URI 支持配置多个,用于不同环境(开发/测试/生产)
R-04访问令牌(access_token)有效期默认 7200 秒(2 小时),可配置
R-05刷新令牌(refresh_token)有效期默认 2592000 秒(30 天),可配置
R-06客户端密钥(clientSecret)在页面上脱敏显示,仅创建时可见完整值
R-07支持配置自动授权的 scope,用户无需手动确认
R-08删除应用前需确认无活跃令牌,否则提示"该应用下有 N 个活跃令牌,请先处理"

数据字段:

字段名类型必填说明
nameString应用名称,如"CRM 系统"
clientIdString客户端唯一标识,创建后不可改
clientSecretString客户端密钥,加密存储
redirectUrisString[]允许的重定向 URI 列表
grantTypesString[]授权类型列表
scopesString[]授权范围,如 ["user_info", "read", "write"]
accessTokenValiditySecondsInteger访问令牌有效期(秒)
refreshTokenValiditySecondsInteger刷新令牌有效期(秒)
autoApproveScopesString[]自动授权无需用户确认的 scope
enableBoolean是否启用

接口设计:

接口名称请求方式接口路径权限标识说明
获取应用列表GET/admin-api/system/oauth2-client/listsystem:oauth2-client:query获取所有应用
获取应用详情GET/admin-api/system/oauth2-client/getsystem:oauth2-client:query获取单个应用详情
创建应用POST/admin-api/system/oauth2-client/createsystem:oauth2-client:create创建 OAuth2 应用
更新应用PUT/admin-api/system/oauth2-client/updatesystem:oauth2-client:update更新 OAuth2 应用
删除应用DELETE/admin-api/system/oauth2-client/deletesystem:oauth2-client:delete删除 OAuth2 应用

3.1.4 社交客户端配置

页面描述:

  • 列表页:展示已配置的所有社交平台客户端,按平台类型分组显示
  • 配置页:表单包含平台类型、应用 ID(AppID)、应用密钥(AppSecret)、回调地址、是否启用等

支持的社交平台:

平台类型编码登录方式适用场景
微信开放平台10PC 扫码登录网站端扫码登录
微信公众号11公众号内授权微信内 H5 页面授权
微信小程序12小程序登录小程序内一键登录
钉钉20企业扫码登录企业用户扫码登录
企业微信21企业微信扫码企业微信内登录
QQ30QQ 授权登录个人用户 QQ 登录
微博31微博授权登录个人用户微博登录
飞书40飞书扫码登录飞书企业用户登录

业务规则:

规则编号规则描述
R-01同一租户下,同一平台类型只能配置一个客户端
R-02应用密钥加密存储,页面脱敏显示
R-03回调地址必须是 HTTPS 协议(生产环境)
R-04停用客户端后,该平台的社交登录入口在前台不显示
R-05配置完成后,需在前台社交登录区域展示对应平台图标

接口设计:

接口名称请求方式接口路径权限标识说明
获取社交客户端列表GET/admin-api/system/social-client/listsystem:social-client:query获取配置列表
创建社交客户端POST/admin-api/system/social-client/createsystem:social-client:create新增配置
更新社交客户端PUT/admin-api/system/social-client/updatesystem:social-client:update修改配置
删除社交客户端DELETE/admin-api/system/social-client/deletesystem:social-client:delete删除配置

3.1.5 登录日志

登录日志的详细设计请参见 01-08-日志审计.md 中的"登录日志"章节。此处仅描述与认证授权模块的关联关系。

关联说明:

  • 每次登录成功/失败时,认证模块自动调用日志模块写入登录日志
  • 日志记录包含:登录方式(账号密码/手机验证码/社交登录/扫码登录)、登录 IP、浏览器信息、登录结果
  • 管理员可在日志审计模块统一查看所有登录日志

3.1.6 在线用户管理

页面描述:

  • 列表页:展示当前所有在线用户的会话信息
  • 列表字段:会话编号、用户名、部门、登录 IP、登录地点、浏览器、操作系统、登录时间、最后活跃时间
  • 操作列:强制踢出

业务规则:

规则编号规则描述
R-01在线用户数据从 Redis 中实时读取,反映当前活跃会话
R-02同一用户可能在多个设备同时在线(如 PC + 手机),显示为多条记录
R-03踢出用户后,该会话的 Token 立即失效,用户下次操作时提示"您已被强制下线"
R-04踢出操作记录操作日志,包含操作人和被踢出的用户信息
R-05最后活跃时间超过 Token 有效期的记录自动消失(会话过期)

接口设计:

接口名称请求方式接口路径权限标识说明
获取在线用户列表GET/admin-api/system/auth/get-online-sessionsystem:auth:kickout获取在线用户
踢出用户POST/admin-api/system/auth/logout-by-session-idsystem:auth:kickout强制踢出指定会话

3.2 前台用户端

3.2.1 功能清单

功能优先级说明
账号密码登录P0用户名/手机号/邮箱 + 密码
手机号验证码登录P0手机号 + 短信验证码,免密码
社交登录P1微信/QQ/钉钉等第三方登录
扫码登录P2手机 App 扫码登录 PC 端
用户注册P0新用户自助注册账号
忘记密码P0通过手机/邮箱自助重置密码
修改密码P0已登录状态修改密码
退出登录P0退出当前账号

3.2.2 账号密码登录

页面描述:

  • 登录页布局:顶部系统 Logo + 标题,中间表单区域(账号输入框、密码输入框、验证码区域、登录按钮),底部社交登录图标 + 注册链接 + 忘记密码链接
  • 支持切换登录方式:Tab 切换"账号登录"和"手机号登录"

交互流程:

1. 用户输入账号(用户名/手机号/邮箱均可)
2. 用户输入密码
3. 判断是否需要验证码:
   - 首次登录 或 连续密码错误 >= 3 次 -> 显示验证码区域
   - 否则 -> 隐藏验证码区域
4. 如需验证码,用户拖动滑块完成验证
5. 点击"登录"按钮
6. 系统校验顺序:
   a. 验证码是否正确(如需要)
   b. 账号是否存在
   c. 账号是否被锁定(密码错误 >= 5 次)
   d. 账号是否被禁用
   e. 密码是否正确
7. 校验通过 -> 保存 Token 到本地 -> 跳转首页或来源页
8. 校验失败 -> 显示对应错误提示 -> 记录失败次数

业务规则:

规则编号规则描述
R-01账号支持三种格式:用户名(4-30 位字母数字)、手机号(11 位)、邮箱
R-02密码连续错误 5 次,锁定 30 分钟。锁定期间提示"账号已锁定,请 30 分钟后重试"
R-03验证码在密码错误 3 次后强制出现,防止暴力破解
R-04"记住我"有效期默认 7 天,勾选后 7 天内无需重新登录
R-05登录成功后跳转至用户之前访问的页面(来源页),若无来源页则跳转首页
R-06租户过期(expireTime < 当前时间)时,该租户所有用户无法登录,提示"您的租户已过期,请联系管理员"

3.2.3 手机号验证码登录

页面描述:

  • 登录页:手机号输入框、验证码输入框 + "获取验证码"按钮、登录按钮
  • 底部:切换"账号密码登录"、社交登录图标、注册链接

交互流程:

1. 用户输入手机号
2. 前端校验手机号格式(11 位数字)
3. 点击"获取验证码"
4. 按钮变为 60 秒倒计时,不可重复点击
5. 用户收到短信验证码(6 位数字)
6. 输入验证码
7. 点击"登录"
8. 系统校验:
   a. 手机号格式是否正确
   b. 验证码是否正确且在有效期内
   c. 该手机号是否已注册
      - 已注册 -> 直接登录
      - 未注册 -> 自动创建账号并登录
9. 登录成功 -> 保存 Token -> 跳转首页

业务规则:

规则编号规则描述
R-01手机号格式校验:11 位数字,1 开头
R-02验证码为 6 位数字
R-03验证码有效期 10 分钟,过期需重新获取
R-0460 秒内只能发送一次验证码(前端倒计时 + 后端频率限制)
R-05每个手机号每天最多发送 10 次验证码
R-06手机号未注册时自动创建账号(用户名默认为手机号,密码随机生成)
R-07验证码输错 3 次后当前验证码失效,需重新获取

接口设计:

接口名称请求方式接口路径说明
发送短信验证码POST/admin-api/system/sms-code/send发送验证码到手机
手机号验证码登录POST/admin-api/system/auth/sms-login验证码登录

发送验证码 - 请求参数:

参数名类型必填说明
mobileString手机号
sceneInteger使用场景(1-登录 2-注册 3-找回密码)

验证码登录 - 请求参数:

参数名类型必填说明
mobileString手机号
codeInteger验证码

返回结果(登录成功):

字段名类型说明
accessTokenString访问令牌
refreshTokenString刷新令牌
expiresTimeLong过期时间(毫秒时间戳)

3.2.4 社交登录

页面描述:

  • 登录页底部展示已启用的社交平台图标(微信、QQ、钉钉等)
  • 点击图标跳转到对应平台的授权页面

业务流程:

1. 用户点击"微信登录"图标
2. 前端请求后端获取微信授权 URL
3. 页面跳转到微信授权页(用户扫码或确认授权)
4. 用户在微信端确认授权
5. 微信回调 PMForge 后端,携带授权码 code
6. 后端用 code 向微信换取 access_token
7. 后端用 access_token 获取微信用户信息(openid、昵称、头像)
8. 查询该微信 openid 是否已绑定 PMForge 账号:
   - 已绑定 -> 直接登录,返回 Token
   - 未绑定 -> 两种处理方式:
     a. 自动创建新账号并绑定(推荐)
     b. 跳转到绑定已有账号页面
9. 登录成功 -> 保存 Token -> 跳转首页

接口设计:

接口名称请求方式接口路径说明
获取社交授权 URLGET/admin-api/system/auth/social-authorize获取跳转授权页 URL
社交快捷登录POST/admin-api/system/auth/social-quick-login已绑定用户快捷登录
社交绑定POST/admin-api/system/auth/social-bind绑定社交账号到已有账号
社交解绑POST/admin-api/system/auth/social-unbind解绑社交账号

快捷登录 - 请求参数:

参数名类型必填说明
typeInteger社交平台类型(10-微信 20-QQ 30-钉钉等)
codeString授权码
stateStringstate 防 CSRF 参数

3.2.5 扫码登录

页面描述:

  • PC 端登录页展示二维码区域
  • 二维码下方提示"打开手机 App 扫码登录"
  • 二维码过期时显示"二维码已过期,点击刷新"

业务流程:

1. PC 端打开登录页,点击"扫码登录"Tab
2. 前端请求后端生成二维码(包含唯一的 qrcodeId)
3. 页面展示二维码图片
4. PC 端每 2 秒轮询检测扫码状态
5. 用户打开手机 App 扫描二维码
6. App 解析二维码中的 qrcodeId,向服务器查询状态
7. 服务器返回"待确认",App 显示确认页面(含 PC 端设备信息)
8. 用户在 App 上点击"确认登录"
9. 服务器更新状态为"已确认"
10. PC 端轮询检测到"已确认"状态,获取 Token,跳转首页

状态流转:

状态说明PC 端展示
WAITING等待扫码显示二维码
SCANNED已扫码待确认显示"已扫码,请在手机上确认"
CONFIRMED已确认登录自动跳转首页
CANCELLED已取消显示"已取消,请重新扫码"
EXPIRED已过期显示"二维码已过期,点击刷新"

接口设计:

接口名称请求方式接口路径说明
获取扫码二维码GET/admin-api/system/auth/get-qrcode生成二维码
检测扫码状态GET/admin-api/system/auth/check-qrcodePC 端轮询状态
确认扫码登录POST/admin-api/system/auth/confirm-qrcodeApp 端确认登录
取消扫码POST/admin-api/system/auth/cancel-qrcodeApp 端取消登录

获取二维码 - 返回结果:

字段名类型说明
qrcodeIdString二维码唯一标识
qrcodeUrlString二维码图片 URL
expireTimeLong过期时间(秒),默认 120 秒

3.2.6 用户注册

页面描述:

  • 注册页:手机号/邮箱输入框、验证码输入框、密码输入框、确认密码输入框、注册按钮
  • 底部:"已有账号?立即登录"链接
  • 可选:邀请码输入框

业务规则:

规则编号规则描述
R-01手机号和邮箱不能与已注册用户重复
R-02用户名可选填,4-30 位字母数字,不可与已有用户名重复
R-03密码强度要求:8-20 位,必须包含字母和数字
R-04确认密码必须与新密码一致
R-05注册成功后自动登录(返回 Token,跳转首页)
R-06如开启邀请码功能,注册时必须填写有效邀请码
R-07注册成功自动记录登录日志(日志类型为"注册")

接口设计:

接口名称请求方式接口路径说明
用户注册POST/admin-api/system/auth/register新用户注册

请求参数:

参数名类型必填说明
usernameString用户名(4-30 位字母数字)
mobileString手机号(与邮箱二选一)
emailString邮箱(与手机号二选一)
codeInteger短信/邮件验证码
passwordString密码(8-20 位,含字母和数字)
inviteCodeString邀请码(如开启邀请码功能则必填)

3.2.7 忘记密码

页面描述:

  • 分步表单:步骤 1 输入手机号/邮箱 -> 步骤 2 输入验证码 -> 步骤 3 设置新密码 -> 完成

业务流程:

1. 用户点击"忘记密码"
2. 选择找回方式:手机号 / 邮箱
3. 输入手机号或邮箱
4. 获取验证码
5. 输入验证码,点击"下一步"
6. 系统校验验证码
7. 进入"设置新密码"页面
8. 输入新密码和确认密码
9. 提交修改
10. 修改成功 -> 跳转登录页

业务规则:

规则编号规则描述
R-01手机号/邮箱必须是已注册的,否则提示"该手机号/邮箱未注册"
R-02验证码有效期 10 分钟
R-03新密码不能与最近 3 次密码相同
R-04密码强度要求同注册(8-20 位,含字母和数字)
R-05密码重置成功后,该用户所有设备的 Token 失效(强制重新登录)

接口设计:

接口名称请求方式接口路径说明
校验验证码POST/admin-api/system/auth/verify-code校验身份验证码
重置密码POST/admin-api/system/auth/reset-password设置新密码

重置密码 - 请求参数:

参数名类型必填说明
mobileString手机号(与邮箱二选一)
emailString邮箱(与手机号二选一)
codeInteger验证码
passwordString新密码

3.2.8 修改密码

页面描述:

  • 个人中心 -> 安全设置页面
  • 表单:当前密码、新密码、确认新密码

业务规则:

规则编号规则描述
R-01当前密码必须正确才能修改
R-02新密码不能与最近 3 次密码相同
R-03密码强度要求:8-20 位,包含字母和数字
R-04修改成功后,该用户所有设备的 Token 全部失效,需重新登录
R-05修改密码操作记录操作日志

接口设计:

接口名称请求方式接口路径说明
修改密码PUT/admin-api/system/user/profile/update-password修改当前用户密码

请求参数:

参数名类型必填说明
oldPasswordString当前密码
newPasswordString新密码

3.2.9 退出登录

业务规则:

规则编号规则描述
R-01退出登录时,当前 Token 失效
R-02退出登录时记录登出日志(日志类型为"登出")
R-03前端清除本地保存的 Token,跳转登录页
R-04退出登录不影响其他设备的会话

接口设计:

接口名称请求方式接口路径说明
退出登录POST/admin-api/system/auth/logout退出登录
刷新令牌POST/admin-api/system/auth/refresh-token用 refreshToken 换取新的 accessToken

四、非功能需求

4.1 性能要求

指标要求说明
登录接口响应时间< 500ms从点击登录到返回结果
验证码发送响应时间< 3s从点击发送到短信到达
Token 刷新响应时间< 200msrefreshToken 换取新 Token
社交登录跳转时间< 1s从点击到跳转至第三方授权页
在线用户列表加载时间< 1s100 人以内在线
登录日志查询响应时间< 1s30 天内数据

4.2 安全要求

安全项实现方式说明
密码加密存储BCrypt 算法不可逆加密,即使数据库泄露也无法还原密码
传输加密全站 HTTPS防止中间人攻击
防暴力破解5 次锁定 30 分钟密码连续错误自动锁定
防重放攻击Token + 时间戳每次请求携带 Token,过期失效
XSS 防护输入过滤 + 输出转义防止恶意脚本注入
CSRF 防护Token 验证 + state 参数OAuth2 流程中 state 参数防 CSRF
敏感信息脱敏日志中密码/手机号脱敏日志中不存储明文密码,手机号中间 4 位用 * 替代
Token 安全短有效期 + 刷新机制accessToken 2 小时过期,通过 refreshToken 续期
密码历史记录最近 3 次密码新密码不能与历史密码重复

4.3 兼容性要求

要求
PC 浏览器Chrome 80+、Firefox 75+、Safari 13+、Edge 80+
移动端浏览器iOS Safari 12+、Android Chrome 80+
微信内置浏览器支持(公众号/小程序登录场景)
小程序微信基础库 2.0+

五、数据设计

5.1 数据模型

5.1.1 用户表(system_users)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT用户编号
usernameVARCHAR(30)NOT NULL用户名(登录用)
passwordVARCHAR(100)NOT NULL密码(BCrypt 加密存储)
nicknameVARCHAR(30)NOT NULL用户昵称(显示用)
mobileVARCHAR(11)-手机号
emailVARCHAR(50)-邮箱
avatarVARCHAR(512)-头像 URL
statusTINYINTNOT NULL, DEFAULT 0状态(0-正常 1-停用)
dept_idBIGINT-所属部门编号
post_idsVARCHAR(255)-岗位编号列表(JSON 数组)
user_typeTINYINTNOT NULL用户类型(1-会员 2-管理员)
login_ipVARCHAR(50)-最后登录 IP
login_dateDATETIME-最后登录时间
tenant_idBIGINTNOT NULL所属租户编号
creatorVARCHAR(64)-创建者
create_timeDATETIMENOT NULL创建时间
updaterVARCHAR(64)-更新者
update_timeDATETIMENOT NULL更新时间
deletedBIT(1)NOT NULL, DEFAULT 0删除标记

索引设计:

索引名字段类型说明
uk_usernameusername, tenant_idUNIQUE同租户下用户名唯一
idx_mobilemobileNORMAL按手机号查询
idx_statusstatusNORMAL按状态筛选
idx_dept_iddept_idNORMAL按部门查询
idx_tenant_idtenant_idNORMAL按租户查询

5.1.2 登录日志表(system_login_log)

详细设计参见 01-08-日志审计.md

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT日志编号
log_typeINTNOT NULL日志类型(100-登录 101-登出 200-注册)
trace_idVARCHAR(64)-链路追踪编号
user_idBIGINT-用户编号(登录失败时可能为空)
user_typeTINYINTNOT NULL用户类型
usernameVARCHAR(50)NOT NULL用户账号(冗余存储)
resultTINYINTNOT NULL登录结果
user_ipVARCHAR(50)-用户 IP
user_agentVARCHAR(512)-浏览器 UA
tenant_idBIGINTNOT NULL租户编号
create_timeDATETIMENOT NULL创建时间

5.1.3 OAuth2 客户端表(system_oauth2_client)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
nameVARCHAR(128)NOT NULL应用名称
client_idVARCHAR(255)NOT NULL客户端 ID(唯一)
secretVARCHAR(255)NOT NULL客户端密钥(加密存储)
redirect_urisVARCHAR(255)NOT NULL重定向 URI 列表
authorized_grant_typesVARCHAR(255)NOT NULL授权类型列表
scopeVARCHAR(255)-授权范围
access_token_validity_secondsINTNOT NULL访问令牌有效期(秒)
refresh_token_validity_secondsINTNOT NULL刷新令牌有效期(秒)
auto_approve_scopeVARCHAR(255)-自动授权的 scope
enableBIT(1)NOT NULL, DEFAULT 1是否启用
tenant_idBIGINTNOT NULL租户编号
creatorVARCHAR(64)-创建者
create_timeDATETIMENOT NULL创建时间
updaterVARCHAR(64)-更新者
update_timeDATETIMENOT NULL更新时间
deletedBIT(1)NOT NULL, DEFAULT 0删除标记

5.1.4 社交客户端表(system_social_client)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
nameVARCHAR(128)NOT NULL应用名称
social_typeINTNOT NULL社交平台类型
client_idVARCHAR(255)NOT NULL应用 ID(AppID)
client_secretVARCHAR(255)NOT NULL应用密钥(加密存储)
agent_idVARCHAR(255)-应用 AgentId(企业微信/钉钉需要)
redirect_uriVARCHAR(255)NOT NULL回调地址
enableBIT(1)NOT NULL, DEFAULT 1是否启用
tenant_idBIGINTNOT NULL租户编号
creatorVARCHAR(64)-创建者
create_timeDATETIMENOT NULL创建时间
updaterVARCHAR(64)-更新者
update_timeDATETIMENOT NULL更新时间
deletedBIT(1)NOT NULL, DEFAULT 0删除标记

5.2 数据字典

字典类型编码字典名称字典数据项
system_user_type用户类型1-会员, 2-管理员
system_login_type登录类型10-账号密码, 20-手机验证码, 30-社交登录, 40-扫码登录
system_login_result登录结果0-成功, 10-账号密码错误, 11-验证码错误, 20-用户被禁用, 30-IP 黑名单
system_social_type社交平台类型10-微信, 20-QQ, 30-微博, 40-钉钉, 50-企业微信, 60-飞书
system_oauth2_grant_typeOAuth2 授权类型authorization_code-授权码, implicit-隐藏式, password-密码式, client_credentials-客户端凭证
common_status通用状态0-开启, 1-关闭

六、跨模块联动

6.1 与用户管理模块的联动

联动场景触发条件联动行为
登录时加载用户信息用户登录成功从用户管理模块获取用户详情(昵称、头像、部门、角色),写入 Token 扩展信息
用户被禁用管理员在用户管理中禁用某用户该用户所有在线 Token 立即失效,下次登录提示"账号已被禁用"
密码重置管理员在用户管理中重置用户密码该用户所有 Token 失效,需重新登录
手机号验证码验证码登录/注册/找回密码调用消息通知模块的短信发送能力

6.2 与租户管理模块的联动

联动场景触发条件联动行为
租户过期租户 expireTime < 当前时间该租户所有用户无法登录,提示"租户已过期"
租户停用管理员停用某租户该租户所有用户 Token 立即失效
租户识别用户登录时根据请求头 tenant-id 或域名识别所属租户,确保数据隔离

6.3 与日志审计模块的联动

联动场景触发条件联动行为
登录日志登录成功/失败/登出/注册自动写入登录日志(含登录方式、IP、浏览器、结果)
操作日志管理员踢出用户、修改 OAuth2 配置自动写入操作日志

6.4 与消息通知模块的联动

联动场景触发条件联动行为
短信验证码手机号验证码登录/注册/找回密码调用短信发送接口发送验证码
邮件验证码邮箱找回密码调用邮件发送接口发送验证码
异地登录通知检测到异地登录(安全审计模块触发)发送站内信/邮件通知用户

6.5 与角色权限模块的联动

联动场景触发条件联动行为
登录后加载权限用户登录成功从角色权限模块获取用户角色列表和权限标识列表,写入 Token
动态路由前端加载菜单根据 Token 中的权限信息,从角色权限模块获取可访问菜单树
接口鉴权每次 API 请求解析 Token 中的权限标识,校验是否有权访问该接口

七、附录

7.1 名词解释

术语英文解释
认证Authentication验证"你是谁"的过程。比如输入账号密码,系统确认你确实是你声称的那个人
授权Authorization验证"你能做什么"的过程。认证通过后,系统根据你的角色和权限决定你能访问哪些功能
Token(令牌)Token登录成功后系统发放的一张"通行证",后续每次操作都出示这张通行证来证明身份,无需重复输入密码
Access TokenAccess Token访问令牌,有效期较短(默认 2 小时),用于日常 API 请求的身份验证
Refresh TokenRefresh Token刷新令牌,有效期较长(默认 30 天),当 Access Token 过期后用它换取新的 Access Token,用户无需重新登录
OAuth2OAuth 2.0一种行业标准的授权协议,允许第三方应用在不暴露密码的情况下获取用户在系统中的有限授权
SSO(单点登录)Single Sign-On一处登录、多处可用。比如登录了 PMForge 后台,就不需要再单独登录关联的 CRM 系统
BCryptBCrypt一种密码加密算法,特点是加密过程故意设计得很慢(相比普通加密),让黑客即使拿到数据库也无法快速暴力破解密码
验证码CAPTCHA一种区分"人"和"机器人"的验证机制。PMForge 支持滑块拼图和文字点选两种形式
客户端Client在 OAuth2 语境中,指接入 PMForge 的第三方应用(如 CRM 系统),不是指浏览器
授权码Authorization CodeOAuth2 授权码模式中的一种临时凭证,第三方应用用它来换取 Access Token
社交登录Social Login通过微信、QQ、钉钉等第三方社交平台的账号来登录系统,无需单独注册
扫码登录QR Code Login用手机 App 扫描 PC 端展示的二维码来登录 PC 端,本质是手机端已登录的用户"授权"PC 端登录
会话Session用户从登录到退出之间的整个交互过程。一个会话对应一个活跃的 Token
锁定Account Lockout密码连续错误多次后,系统自动暂时禁止该账号登录的安全措施
多租户Multi-Tenant一套系统同时服务多个独立的组织(租户),各租户数据互相隔离

7.2 接口汇总

序号接口名称方法路径优先级
1管理员登录POST/admin-api/system/auth/login后台P0
2手机号验证码登录POST/admin-api/system/auth/sms-login前台P0
3发送短信验证码POST/admin-api/system/sms-code/send前台P0
4社交快捷登录POST/admin-api/system/auth/social-quick-login前台P1
5获取社交授权 URLGET/admin-api/system/auth/social-authorize前台P1
6社交绑定POST/admin-api/system/auth/social-bind前台P1
7社交解绑POST/admin-api/system/auth/social-unbind前台P1
8获取扫码二维码GET/admin-api/system/auth/get-qrcode前台P2
9检测扫码状态GET/admin-api/system/auth/check-qrcode前台P2
10确认扫码登录POST/admin-api/system/auth/confirm-qrcode前台P2
11取消扫码POST/admin-api/system/auth/cancel-qrcode前台P2
12用户注册POST/admin-api/system/auth/register前台P0
13校验验证码POST/admin-api/system/auth/verify-code前台P0
14重置密码POST/admin-api/system/auth/reset-password前台P0
15修改密码PUT/admin-api/system/user/profile/update-password前台P0
16退出登录POST/admin-api/system/auth/logout通用P0
17刷新令牌POST/admin-api/system/auth/refresh-token通用P0
18获取在线用户列表GET/admin-api/system/auth/get-online-session后台P2
19踢出用户POST/admin-api/system/auth/logout-by-session-id后台P2
20OAuth2 应用列表GET/admin-api/system/oauth2-client/list后台P1
21创建 OAuth2 应用POST/admin-api/system/oauth2-client/create后台P1
22更新 OAuth2 应用PUT/admin-api/system/oauth2-client/update后台P1
23删除 OAuth2 应用DELETE/admin-api/system/oauth2-client/delete后台P1
24社交客户端列表GET/admin-api/system/social-client/list后台P1
25创建社交客户端POST/admin-api/system/social-client/create后台P1
26更新社交客户端PUT/admin-api/system/social-client/update后台P1
27删除社交客户端DELETE/admin-api/system/social-client/delete后台P1

7.3 变更记录

版本日期修改内容修改人
v1.02026-09-11初始版本PM Team
v2.02026-09-19全面重写:增强业务场景描述、验收标准、跨模块联动、名词解释PM Team

本文档为认证授权模块 PRD,如有问题请联系产品负责人。