跳到主要内容

System:认证、三方账号与会话缓存

OAuth2 授权与令牌​

业务流程与读写职责​

OAuth2TokenServiceImpl 创建刷新令牌后再创建访问令牌(service/oauth2/OAuth2TokenServiceImpl.java:62)。校验优先读 Redis,未命中回源 MySQL,特定兼容场景允许将有效刷新令牌转换为访问身份(104 行起)。刷新会核对客户端、清理旧访问令牌及缓存,再创建新访问令牌(72 行);移除访问令牌还会移除对应刷新令牌(143 行)。expires_time 限制有效期,scopes 限制授权范围,user_info 保存鉴权需要的用户快照。授权码由 OAuth2CodeServiceImpl.java:36、48 创建和消费,授权确认由 OAuth2ApproveServiceImpl.java:64 更新。

对象关系与设计约定​

客户端表同时有 Long 类型 id 和 String 类型 client_id。授权码、授权记录及令牌中的 client_id 使用业务客户端编号;OAuth2ClientMapper.java:26 按 clientId 查询。部分 DO 注释写成关联 getId(),不能按该注释建立 Long 主键关联。访问令牌通过 refresh_token 字符串关联刷新令牌,用户身份需联合 user_id 与 user_type 解释。

核验日期:2026-09-18。以下为源码预期结构,Java 类型不等同于 SQL 列型、长度、可空性或默认值。实际结构与索引见实测对照。各表继承字段已逐表展开;公共映射解释来源。下述关联均为代码逻辑关联,物理外键以实测为准。

system_oauth2_access_token​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java:25;继承 TenantBaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java:15。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long编号,数据库递增;@TableId35
access_tokenaccessToken: String访问令牌39
refresh_tokenrefreshToken: String刷新令牌43
user_iduserId: Long用户编号47
user_typeuserType: Integer用户类型 枚举 UserTypeEnum53
user_infouserInfo: Map<String, String>用户信息;@TableField(typeHandler = JacksonTypeHandler.class)58
client_idclientId: String业务客户端编号,逻辑关联 system_oauth2_client.client_id64
scopesscopes: List<String>授权范围;@TableField(typeHandler = JacksonTypeHandler.class)69
expires_timeexpiresTime: LocalDateTime过期时间73
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO
tenant_idtenantId: Long租户编号TenantBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectByAccessToken()(18)、selectListByRefreshToken()(21)、selectPage()(25)。以上方法行号相对该表 Mapper。

system_oauth2_approve​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java:20;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java:11。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long编号,数据库自增;@TableId30
user_iduserId: Long用户编号34
user_typeuserType: Integer用户类型 枚举 UserTypeEnum40
client_idclientId: String业务客户端编号,逻辑关联 system_oauth2_client.client_id46
scopescope: String授权范围50
approvedapproved: Boolean是否接受 true - 接受 false - 拒绝57
expires_timeexpiresTime: LocalDateTime过期时间61
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:update()(12)、selectListByUserIdAndUserTypeAndClientId()(20)。以上方法行号相对该表 Mapper。

system_oauth2_client​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java:21;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java:17。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long编号,数据库自增 由于 SQL Server 在存储 String 主键有点问题,所以暂时使用 Long 类型;@TableId33
client_idclientId: String客户端编号37
secretsecret: String客户端密钥41
namename: String应用名45
logologo: String应用图标49
descriptiondescription: String应用描述53
statusstatus: Integer状态 枚举 CommonStatusEnum59
access_token_validity_secondsaccessTokenValiditySeconds: Integer访问令牌的有效期63
refresh_token_validity_secondsrefreshTokenValiditySeconds: Integer刷新令牌的有效期67
redirect_urisredirectUris: List<String>可重定向的 URI 地址;@TableField(typeHandler = JacksonTypeHandler.class)72
authorized_grant_typesauthorizedGrantTypes: List<String>授权类型(模式) 枚举 OAuth2GrantTypeEnum;@TableField(typeHandler = JacksonTypeHandler.class)79
scopesscopes: List<String>授权范围;@TableField(typeHandler = JacksonTypeHandler.class)84
auto_approve_scopesautoApproveScopes: List<String>自动授权的 Scope code 授权时,如果 scope 在这个范围内,则自动通过;@TableField(typeHandler = JacksonTypeHandler.class)91
authoritiesauthorities: List<String>权限;@TableField(typeHandler = JacksonTypeHandler.class)96
resource_idsresourceIds: List<String>资源;@TableField(typeHandler = JacksonTypeHandler.class)101
additional_informationadditionalInformation: String附加信息,JSON 格式105
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectPage()(18)、selectByClientId()(25)。以上方法行号相对该表 Mapper。

system_oauth2_code​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java:20;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java:8。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long编号,数据库递增29
codecode: String授权码33
user_iduserId: Long用户编号37
user_typeuserType: Integer用户类型 枚举 UserTypeEnum43
client_idclientId: String业务客户端编号,逻辑关联 system_oauth2_client.client_id49
scopesscopes: List<String>授权范围;@TableField(typeHandler = JacksonTypeHandler.class)54
redirect_uriredirectUri: String重定向地址58
statestate: String状态62
expires_timeexpiresTime: LocalDateTime过期时间66
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(框架按 id 命名识别,实体未显式标注 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectByCode()(9)。以上方法行号相对该表 Mapper。

system_oauth2_refresh_token​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java:21;继承 TenantBaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java:10。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long编号,数据库字典32
refresh_tokenrefreshToken: String刷新令牌36
user_iduserId: Long用户编号40
user_typeuserType: Integer用户类型 枚举 UserTypeEnum46
client_idclientId: String业务客户端编号,逻辑关联 system_oauth2_client.client_id52
scopesscopes: List<String>授权范围;@TableField(typeHandler = JacksonTypeHandler.class)57
expires_timeexpiresTime: LocalDateTime过期时间61
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO
tenant_idtenantId: Long租户编号TenantBaseDO

源码主键候选为 id(框架按 id 命名识别,实体未显式标注 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:deleteByRefreshToken()(11)、selectByRefreshToken()(18)。以上方法行号相对该表 Mapper。

返回 System 总览

第三方登录与社交账号​

业务流程与读写职责​

SocialUserServiceImpl.bindSocialUser(service/social/SocialUserServiceImpl.java:62)将本地身份绑定到第三方身份,unbindSocialUser(84 行)解除关联。SocialClientServiceImpl(service/social/SocialClientServiceImpl.java:372)维护第三方应用配置。type/openid 联合标识平台用户,token/raw_token_info 和 code/state 支持认证交换,绑定表的 user_type 避免同一数字 user_id 混淆后台与会员身份。微信 SDK 的 Redis 状态另见 Redis 页面。

对象关系与设计约定​

system_social_client 按 social_type + user_type 选择第三方应用;system_social_user 按 type + openid 查找外部账号;绑定表按 user_id + user_type + social_type 将本地用户连接到 social_user_id。凭据字段只记录结构,不提供样例值。

核验日期:2026-09-18。以下为源码预期结构,Java 类型不等同于 SQL 列型、长度、可空性或默认值。实际结构与索引见实测对照。各表继承字段已逐表展开;公共映射解释来源。下述关联均为代码逻辑关联,物理外键以实测为准。

system_social_client​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SocialClientDO.java:20;继承 TenantBaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SocialClientMapper.java:11。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long编号,自增;@TableId33
namename: String应用名37
social_typesocialType: Integer社交类型 枚举 SocialTypeEnum43
user_typeuserType: Integer用户类型 目的:不同用户类型,对应不同的小程序,需要自己的配置 枚举 UserTypeEnum51
statusstatus: Integer状态 枚举 CommonStatusEnum57
client_idclientId: String客户端 id62
client_secretclientSecret: String客户端 Secret66
agent_idagentId: String代理编号 目前只有部分“社交类型”在使用: 1. 企业微信:对应授权方的网页应用 ID74
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO
tenant_idtenantId: Long租户编号TenantBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectBySocialTypeAndUserType()(12)、selectPage()(17)。以上方法行号相对该表 Mapper。

system_social_user_bind​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SocialUserBindDO.java:16;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SocialUserBindMapper.java:11。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long编号;@TableId29
user_iduserId: Long关联的用户编号 关联 UserDO 的编号35
user_typeuserType: Integer用户类型 枚举 UserTypeEnum41
social_user_idsocialUserId: Long社交平台的用户编号 关联 SocialUserDO#getId()48
social_typesocialType: Integer社交平台的类型 冗余 SocialUserDO#getType()54
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:deleteByUserTypeAndUserIdAndSocialType()(12)、deleteByUserTypeAndSocialUserId()(19)、selectByUserTypeAndSocialUserId()(25)、selectListByUserIdAndUserType()(30)、selectByUserIdAndUserTypeAndSocialType()(36)。以上方法行号相对该表 Mapper。

system_social_user​

实体:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SocialUserDO.java:15;继承 BaseDO。

Mapper:ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SocialUserMapper.java:11。

SQL 列名(源码映射)Java 字段 / 类型业务语义与映射来源行
idid: Long自增主键;@TableId28
typetype: Integer社交平台的类型 枚举 SocialTypeEnum34
openidopenid: String社交 openid39
tokentoken: String社交 token43
raw_token_inforawTokenInfo: String原始 Token 数据,一般是 JSON 格式47
nicknamenickname: String用户昵称52
avataravatar: String用户头像56
raw_user_inforawUserInfo: String原始用户数据,一般是 JSON 格式60
codecode: String最后一次的认证 code65
statestate: String最后一次的认证 state69
create_timecreateTime: LocalDateTime创建时间;插入填充BaseDO
update_timeupdateTime: LocalDateTime更新时间;插入/更新填充BaseDO
creatorcreator: String创建者标识;VARCHAR JDBC 映射BaseDO
updaterupdater: String更新者标识;VARCHAR JDBC 映射BaseDO
deleteddeleted: Boolean逻辑删除标记;@TableLogicBaseDO

源码主键候选为 id(显式 @TableId)。实体没有定义数据库二级索引/外键;查询方法与唯一性注释均不能证明实际存在唯一索引。

查询入口:selectByTypeAndCodeAnState()(12)、selectByTypeAndOpenid()(18)、selectPage()(23)。以上方法行号相对该表 Mapper。

返回 System 总览

Redis 与框架存储​

核验日期:2026-09-18;此页为源码和导出配置证据,未连接 Redis 核对实际 key、内容或 TTL。配置 doc/数据库设计管理/nacos/application-common.yaml:35 指向测试 Redis DB 0,Spring Cache 默认 TTL 为 1 小时(54 行起)。此处只描述结构,不记录任何凭据或业务值。

本页代码路径相对 ik_project/yudao-cloud/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/,另注明 framework 路径的除外。

Spring Cache​

基础键格式为 缓存名:参数。启用 TenantRedisCacheManager 时,可变为 缓存名:tenantId:参数,并受全局 key-prefix 影响;不能以常量注释认定实际键没有租户段。证据:框架 yudao-spring-boot-starter-redis/.../config/YudaoCacheAutoConfiguration.java:64、yudao-spring-boot-starter-biz-tenant/.../core/redis/TenantRedisCacheManager.java:34。

缓存名key 参数值结构使用证据
roleidRoleDO JSON(见角色表字段)service/permission/RoleServiceImpl.java:181
user_role_idsuserId角色 ID 集合 JSONservice/permission/PermissionServiceImpl.java:247
menu_role_idsmenuId角色 ID 集合 JSONservice/permission/PermissionServiceImpl.java:203
permission_menu_idspermission菜单 ID 集合 JSONservice/permission/MenuServiceImpl.java:177
oauth_clientclientIdOAuth2ClientDO JSONservice/oauth2/OAuth2ClientServiceImpl.java:102
notify_templatecodeNotifyTemplateDO JSONservice/notify/NotifyTemplateServiceImpl.java:102
mail_accountidMailAccountDO JSONservice/mail/MailAccountServiceImpl.java:84
mail_templatecodeMailTemplateDO JSONservice/mail/MailTemplateServiceImpl.java:111
sms_templatecodeSmsTemplateDO JSONservice/sms/SmsTemplateServiceImpl.java:116
wxa_subscribe_templateuserType小程序订阅模板列表service/social/SocialClientServiceImpl.java:283

dept_children_ids 常量仍存在,但 DeptServiceImpl.java:189 的 Cacheable 已注释,不能列为当前必然写入的缓存。RedisKeyConstants 中 menu_role_ids、sms_template、oauth_client 的说明存在旧参数注释;以上按实际 Cacheable 表达式整理。缓存是派生数据,不额外当成 MySQL 表。

直接 Redis 对象​

键/模式Redis 结构值或 field生命周期 / 证据
oauth2_access_token:tokenStringOAuth2AccessTokenDO JSON;全部字段见 OAuth2 页面按 expiresTime 距现在秒数设置 TTL;dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java:35
system:qwenpaw:user-infoHashfield 为业务 userId 字符串,value 为 QwenPawUserInfo JSONDAO 不设 Hash TTL;dal/redis/qwenpaw/QwenPawUserInfoRedisDAO.java:51、63
system:qwenpaw:hub:admin-tokenStringHub 管理员 Token6 天 TTL;同 DAO:28、102
system:qwenpaw:connect:userId分布式锁随机 UUID 锁值等待 3 秒,租约 360 秒;service/qwenpaw/QwenPawServiceImpl.java:58、161
system:qwenpaw:hub:admin-login-lock分布式锁随机 UUID 锁值等待 5 秒,租约 30 秒;同 Service:61、718
验证码组件传入 keyString验证码数据或计数set 的 TTL 由 expiresInSeconds 指定;framework/captcha/core/RedisCaptchaServiceImpl.java:25
微信 SDK 配置的 key 前缀SDK 管理公众号/小程序认证状态RedisTemplateWxRedisOps;service/social/SocialClientServiceImpl.java:239、358

锁的物理实现由公共 RedisDistributionLockUtils 管理;验证码及微信 SDK 动态 key 未做 keyspace 扫描,不能给出实际键数量。上述直接 RedisDAO 不经过 Spring Cache 的租户缓存名拼接。

QwenPaw Hash value 完整结构​

实体:dal/redis/qwenpaw/QwenPawUserInfo.java:18。userId 是外层 Hash field,不重复放进 JSON Bean。16 个实例字段如下:

字段Java 类型含义
versionInteger数据结构版本,初始值 2
usernameString业务平台及 Hub 用户名
passwordStringAES 加密密文,ENC:v1 格式
hubUserIdStringHub 用户编号
userTokenStringHub 登录 Token
tokenExpireAtLocalDateTime本地过期时间
businessTokenDigestString已同步业务 Token 的 SHA-256 摘要
pendingBusinessTokenDigestString待同步业务 Token 的摘要
runtimeStatusStringNOT_CONFIGURED / INITIALIZING / READY / FAILED / DISABLED
operationIdString异步任务编号
operationRevisionLong乐观锁版本
operationMessageString脱敏状态消息
operationStartedAtLocalDateTime任务开始执行时间;空表示排队
operationUpdatedAtLocalDateTime排队提交/运行心跳时间
createdAtLocalDateTime创建时间
updatedAtLocalDateTime更新时间

该 Hash 兼有凭据和 Runtime 初始化状态,不只是可任意丢弃的查询缓存。Lua 更新同时比较 operationId 与 operationRevision,阻止旧任务状态覆盖;证据为 QwenPawUserInfoRedisDAO.java:30。本次未读取加密密文、Token、用户 JSON,也未验证实际 TTL。

返回 System 总览

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答