# 认证服务模块(crm-auth) **本文引用的文件** - [AuthApplication.java](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java) - [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java) - [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java) - [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java) - [DataInitializer.java](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java) - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) - [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java) - [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [DataScopeTables.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeTables.java) - [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java) - [PermissionResolver.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) - [PermissionGrant.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionGrant.java) - [IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [IAuthUserService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthUserService.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) - [IAuthIdentityService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthIdentityService.java) - [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java) - [ISysRoleService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java) - [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java) - [ISysMenuService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysMenuService.java) - [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java) - [ISysDeptService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysDeptService.java) - [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java) - [IResourceService.java](file://crm-auth/src/main/java/com/crm/auth/service/IResourceService.java) - [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java) - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java) - [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java) - [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java) - [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java) - [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java) - [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java) - [UserInfoDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserInfoDTO.java) - [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java) - [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java) - [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java) - [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java) - [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java) - [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java) - [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java) - [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java) - [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java) - [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java) - [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java) - [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java) - [MenuTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/MenuTypeEnum.java) - [AuthConstants.java](file://crm-auth/src/main/java/com/crm/auth/constant/AuthConstants.java) - [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java) - [application.yml](file://crm-auth/src/main/resources/application.yml) - [DataVisibilityContext.java](file://crm-base/src/main/java/com/crm/base/security/DataVisibilityContext.java) - [DataOwnership.java](file://crm-base/src/main/java/com/crm/base/security/DataOwnership.java) - [DataScopeLevel.java](file://crm-base/src/main/java/com/crm/base/security/DataScopeLevel.java) ## 更新摘要 **变更内容** - 新增统一的权限解析架构,包括PermissionResolver接口设计和PermissionResolverImpl实现类 - 引入PermissionGrant值对象,提供线程安全的权限数据封装和Spring Security集成 - 简化JwtAuthenticationFilter认证流程,通过PermissionResolver统一处理权限解析 - 增强数据范围处理能力,支持多部门并集、子树展开和细粒度权限控制 - 优化权限代码聚合逻辑,支持停用权限点过滤和多角色权限合并 ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本模块为 CRM 后端的认证与授权中心,提供用户登录、JWT 令牌签发与校验、角色权限控制、数据权限(部门/范围)过滤、第三方登录集成(如钉钉)等能力。通过安全配置、过滤器链与拦截器协同工作,实现从请求入口到业务方法的全链路鉴权与数据可见性控制。**最新更新引入了统一的权限解析架构,通过PermissionResolver接口设计实现了更灵活、线程安全的权限管理,显著提升了系统的可扩展性和安全性。** ## 项目结构 认证模块采用分层架构: - 配置层:安全策略、权限开关、第三方登录参数、初始化数据等 - 控制器层:登录、登出、用户信息、系统信息、资源管理等接口 - 安全层:JWT 过滤器、令牌服务、登录用户上下文、异常处理、数据权限拦截器、**统一权限解析器** - 服务层:认证、用户、身份、角色、菜单、部门、资源管理等业务逻辑 - 领域模型:实体、枚举、DTO、入参 - 客户端:第三方登录客户端及工厂 ```mermaid graph TB subgraph "配置" SC["SecurityConfig"] PC["PermissionConfig"] AP["AuthProperties"] DI["DataInitializer"] end subgraph "控制器" AC["AuthController"] SYSC["SystemController"] RC["ResourceController"] end subgraph "安全" JF["JwtAuthenticationFilter"] TS["TokenService"] ALU["AuthLoginUser"] DSI["DataScopeInterceptor"] SEH["SecurityExceptionHandlers"] PR["PermissionResolver"] PG["PermissionGrant"] end subgraph "服务" IAS["IAuthService"] AS["AuthServiceImpl"] IAUS["IAuthUserService"] AUS["AuthUserServiceImpl"] IIDS["IAuthIdentityService"] AIS["AuthIdentityServiceImpl"] IRS["ISysRoleService"] SRS["SysRoleServiceImpl"] IMS["ISysMenuService"] SMS["SysMenuServiceImpl"] IDS["ISysDeptService"] SDS["SysDeptServiceImpl"] IRSVC["IResourceService"] RSVC["ResourceServiceImpl"] end subgraph "第三方" DTAC["DingTalkAuthClient"] TPACF["ThirdPartyAuthClientFactory"] TPI["ThirdPartyUserInfo"] end subgraph "领域模型" LPM["LoginParam"] UPM["UserPageParam"] RN["ResourceNode"] LRDTO["LoginResultDTO"] UIDTO["UserInfoDTO"] ULDTO["UserListDTO"] USVO["UserStatsVO"] AU["AuthUser"] AI["AuthIdentity"] SR["SysRole"] SM["SysMenu"] SD["SysDept"] SUR["SysUserRole"] SRM["SysRoleMenu"] SUD["SysUserDept"] end AC --> IAS AC --> IAUS AC --> IIDS SYSC --> IMS SYSC --> IRS SYSC --> IDS RC --> IRSVC JF --> TS JF --> PR PR --> PG DSI --> ALU AS --> IAUS AS --> IIDS AS --> IRS AS --> IMS AS --> IDS AUS --> IIDS AIS --> IAUS SRS --> IRS SMS --> IMS SDS --> IDS RSVC --> IMS RSVC --> FileApi["FileApi"] DTAC --> TPACF ``` 图表来源 - [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java) - [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java) - [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java) - [DataInitializer.java](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java) - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) - [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java) - [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java) - [PermissionResolver.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) - [PermissionGrant.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionGrant.java) - [IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [IAuthUserService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthUserService.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) - [IAuthIdentityService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthIdentityService.java) - [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java) - [ISysRoleService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java) - [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java) - [ISysMenuService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysMenuService.java) - [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java) - [ISysDeptService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysDeptService.java) - [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java) - [IResourceService.java](file://crm-auth/src/main/java/com/crm/auth/service/IResourceService.java) - [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java) - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java) - [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java) - [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java) - [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java) - [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java) - [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java) - [UserInfoDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserInfoDTO.java) - [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java) - [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java) - [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java) - [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java) - [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java) - [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java) - [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java) - [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java) - [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java) - [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java) 章节来源 - [AuthApplication.java](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java) - [application.yml](file://crm-auth/src/main/resources/application.yml) ## 核心组件 - 安全配置与安全过滤器 - SecurityConfig:定义全局安全策略、放行路径、跨域、会话策略、异常处理器注册等 - JwtAuthenticationFilter:解析请求头中的 JWT,构建并设置认证上下文,**集成新的PermissionResolver进行权限解析** - TokenService:JWT 的签发、解析、刷新、黑名单/过期管理(如有) - AuthLoginUser:封装当前登录用户及其角色、权限、数据权限范围 - DataScopeInterceptor:在业务查询前注入数据权限 SQL 片段,限制数据可见范围 - SecurityExceptionHandlers:统一安全相关异常处理与响应 - **统一权限解析架构** - PermissionResolver:权限解析接口,定义resolve()和visibleMenuTree()方法 - PermissionResolverImpl:权限解析实现类,负责用户角色、权限码、数据范围的统一计算 - PermissionGrant:权限结果值对象,包含数据可见性、权限码集合、角色编码集合,**线程安全且不可变** - 认证与授权服务 - IAuthService/AuthServiceImpl:登录、登出、密码校验、第三方登录流程编排,**新增事务外组织准入预校验** - IAuthUserService/AuthUserServiceImpl:用户信息查询、状态校验、缓存(可选)、用户列表分页查询 - IAuthIdentityService/AuthIdentityServiceImpl:多身份源绑定与校验(手机号、邮箱、第三方) - ISysRoleService/SysRoleServiceImpl:角色查询、角色-权限映射 - ISysMenuService/SysMenuServiceImpl:菜单树、按钮级权限标识 - ISysDeptService/SysDeptServiceImpl:部门树、用户-部门关联 - **统一权限资源管理服务** - IResourceService:资源树管理接口,提供全量查询、新增编辑、删除、图标上传等功能 - ResourceServiceImpl:资源树服务实现,包含复杂的验证逻辑、层级约束检查和文件上传集成 - ResourceNode:资源节点数据传输对象,支持catalog/menu/button三种类型 - 第三方登录与企业级安全 - ThirdPartyAuthClient:第三方登录抽象接口,**新增组织成员验证方法** - DingTalkAuthClient:钉钉登录实现,**新增企业级token管理和组织准入校验** - ThirdPartyAuthClientFactory:按类型创建对应第三方客户端 - ThirdPartyUserInfo:第三方返回的用户信息标准化 - 用户管理增强组件 - UserPageParam:用户列表分页查询参数,支持多维度筛选条件 - UserListDTO:用户列表数据传输对象,包含用户基本信息和关联信息 - UserStatsVO:用户统计视图对象,提供用户数量、状态分布等统计信息 - 领域模型与常量 - LoginParam/LoginResultDTO/UserInfoDTO:登录入参与结果 - UserPageParam/UserListDTO/UserStatsVO:用户列表分页查询和统计相关DTO - AuthUser/AuthIdentity/SysRole/SysMenu/SysDept 等实体 - DataScopeEnum/IdentityTypeEnum/MenuTypeEnum:数据权限、身份类型、菜单类型 - AuthConstants:认证相关常量,**新增组织成员验证错误码和资源管理错误码** 章节来源 - [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java) - [PermissionResolver.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) - [PermissionGrant.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionGrant.java) - [IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [IAuthUserService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthUserService.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) - [IAuthIdentityService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthIdentityService.java) - [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java) - [ISysRoleService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java) - [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java) - [ISysMenuService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysMenuService.java) - [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java) - [ISysDeptService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysDeptService.java) - [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java) - [IResourceService.java](file://crm-auth/src/main/java/com/crm/auth/service/IResourceService.java) - [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java) - [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java) - [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.java) - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java) - [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java) - [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java) - [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java) - [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java) - [UserInfoDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserInfoDTO.java) - [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java) - [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java) - [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java) - [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java) - [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java) - [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java) - [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java) - [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java) - [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java) - [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java) - [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java) - [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java) - [MenuTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/MenuTypeEnum.java) - [AuthConstants.java](file://crm-auth/src/main/java/com/crm/auth/constant/AuthConstants.java) ## 架构总览 认证服务以"控制器 -> 服务 -> 安全上下文"为主线,配合 JWT 过滤器与数据权限拦截器完成全链路鉴权。**最新更新引入了统一的权限解析架构,通过PermissionResolver接口实现了权限计算的解耦和扩展,PermissionGrant值对象提供了线程安全的权限数据封装,显著提升了系统的可维护性和安全性。** ```mermaid sequenceDiagram participant C as "客户端" participant AC as "AuthController" participant RC as "ResourceController" participant AS as "AuthServiceImpl" participant RSVC as "ResourceServiceImpl" participant AUS as "AuthUserServiceImpl" participant AIS as "AuthIdentityServiceImpl" participant DTAC as "DingTalkAuthClient" participant TS as "TokenService" participant JF as "JwtAuthenticationFilter" participant PR as "PermissionResolver" participant DSI as "DataScopeInterceptor" participant FileApi as "FileApi" C->>AC : "POST /auth/login" AC->>AS : "login(LoginParam)" AS->>DTAC : "获取用户信息" AS->>DTAC : "事务外组织准入预校验" DTAC-->>AS : "组织成员验证结果" AS->>AUS : "事务内DB操作" AS->>AIS : "身份绑定与校验" AS-->>AC : "认证成功" AC->>TS : "签发JWT(含用户ID/角色/权限/数据范围)" TS-->>AC : "返回Token" AC-->>C : "LoginResultDTO{token,...}" C->>RC : "GET /api/resources" RC->>RSVC : "listAll()" RSVC->>FileApi : "uploadIcon(file)" FileApi-->>RSVC : "FileInfoDTO" RSVC-->>RC : "ResourceNode[]" RC-->>C : "资源树数据" C->>AC : "带Authorization的请求" AC->>JF : "解析JWT并构建认证上下文" JF->>PR : "调用PermissionResolver.resolve(userId)" PR-->>JF : "返回PermissionGrant" JF->>DSI : "设置数据权限范围" DSI-->>AC : "注入SQL数据范围片段" AC-->>C : "受保护资源" ``` 图表来源 - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) - [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) - [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java) - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [PermissionResolver.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java) ## 详细组件分析 ### 安全配置与过滤器链 - SecurityConfig:集中配置白名单、跨域、会话策略、异常处理器;将 JwtAuthenticationFilter 加入过滤器链;可配置是否启用基于注解的权限控制。 - JwtAuthenticationFilter:从请求头提取 Token,调用 TokenService 解析并填充认证上下文,**现在通过PermissionResolver统一处理权限解析**。 - DataScopeInterceptor:根据当前用户的 DataScopeEnum 与部门关系,动态拼接 SQL 条件,确保只返回允许的数据行。 - SecurityExceptionHandlers:捕获未认证、无权限、参数错误等异常,统一返回标准响应。 ```mermaid flowchart TD Start(["请求进入"]) --> CheckPath["匹配白名单/静态资源"] CheckPath --> |放行| Next["继续业务处理"] CheckPath --> |需认证| Extract["提取Authorization头"] Extract --> Parse["TokenService解析JWT"] Parse --> Valid{"Token有效?"} Valid --> |否| Deny["拒绝访问(401/403)"] Valid --> |是| SetCtx["设置认证上下文(AuthLoginUser)"] SetCtx --> PermResolve["PermissionResolver解析权限"] PermResolve --> Scope["DataScopeInterceptor注入数据范围"] Scope --> Next Next --> End(["返回响应"]) ``` 图表来源 - [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [PermissionResolver.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java) 章节来源 - [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [PermissionResolver.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java) ### 认证流程与令牌处理 - 登录流程:AuthController 接收 LoginParam,AuthServiceImpl 调用用户与身份服务进行校验,成功后由 TokenService 签发 JWT,返回 LoginResultDTO。 - 令牌处理:TokenService 负责生成、解析、刷新、失效策略;JwtAuthenticationFilter 在每个请求中解析并设置认证上下文。 - 会话管理:建议无状态化(JWT),如需限流或黑名单可在 TokenService 中扩展 Redis 存储。 **更新** 登录流程现已优化,组织准入校验在事务外执行,避免长时间占用数据库连接。**认证流程已集成新的PermissionResolver,实现了权限解析的统一化和线程安全化。** ```mermaid sequenceDiagram participant Client as "客户端" participant AC as "AuthController" participant AS as "AuthServiceImpl" participant DTAC as "DingTalkAuthClient" participant AUS as "AuthUserServiceImpl" participant AIS as "AuthIdentityServiceImpl" participant TS as "TokenService" participant JF as "JwtAuthenticationFilter" participant PR as "PermissionResolver" Client->>AC : "POST /auth/login" AC->>AS : "login(LoginParam)" AS->>DTAC : "获取用户信息" AS->>DTAC : "事务外组织准入预校验" DTAC-->>AS : "组织成员验证" AS->>AUS : "事务内DB操作" AS->>AIS : "身份绑定" AS-->>AC : "成功" AC->>TS : "createToken(user, roles, dataScope)" TS-->>AC : "token" AC-->>Client : "LoginResultDTO(token, userInfo)" Client->>AC : "带Authorization的请求" AC->>JF : "解析JWT" JF->>PR : "resolve(userId)" PR-->>JF : "PermissionGrant" JF->>JF : "设置Spring Security上下文" ``` 图表来源 - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) - [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [PermissionResolver.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) - [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java) - [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java) 章节来源 - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) - [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [PermissionResolver.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) - [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java) - [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java) ### 统一权限解析架构 **新增** 统一的权限解析架构通过PermissionResolver接口实现了权限计算的解耦和扩展,PermissionGrant值对象提供了线程安全的权限数据封装。 - **PermissionResolver接口**:定义了权限解析的核心方法,包括用户权限解析和可见菜单树查询 - **PermissionResolverImpl实现**:实现了复杂的多角色权限合并、数据范围计算、部门子树展开等逻辑 - **PermissionGrant值对象**:不可变的权限结果封装,包含数据可见性、权限码集合、角色编码集合 - **线程安全保障**:PermissionGrant使用不可变集合,确保多线程环境下的数据安全 ```mermaid classDiagram class PermissionResolver { +resolve(Long userId) PermissionGrant +visibleMenuTree(Long userId) SysMenu[] } class PermissionResolverImpl { -SysUserRoleMapper sysUserRoleMapper -SysRoleMapper sysRoleMapper -SysRoleMenuMapper sysRoleMenuMapper -SysMenuMapper sysMenuMapper -AuthUserMapper authUserMapper -DeptTreeCache deptTreeCache -SysUserDeptMapper sysUserDeptMapper +resolve(Long userId) PermissionGrant +visibleMenuTree(Long userId) SysMenu[] } class PermissionGrant { -DataVisibility visibility -Set~String~ permCodes -Set~String~ roleCodes +getVisibility() DataVisibility +getPermCodes() Set~String~ +getRoleCodes() Set~String~ +asAuthorities() SimpleGrantedAuthority[] } PermissionResolver <|.. PermissionResolverImpl PermissionResolverImpl --> PermissionGrant : 返回 ``` 图表来源 - [PermissionResolver.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) - [PermissionGrant.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionGrant.java) **Section sources** - [PermissionResolver.java:16-35](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java#L16-L35) - [PermissionResolverImpl.java:39-139](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java#L39-L139) - [PermissionGrant.java:23-67](file://crm-auth/src/main/java/com/crm/auth/security/PermissionGrant.java#L23-L67) ### 权限管理与数据权限控制 - 角色与菜单:SysRole 与 SysMenu 建立 RBAC 模型,支持菜单与按钮级权限标识。 - 用户-角色-部门:SysUserRole、SysUserDept 维护用户与角色、部门的关联。 - 数据权限:DataScopeEnum 定义数据可见范围(全部、本部门、本部门及以下、本人等),DataScopeInterceptor 根据当前用户范围注入 SQL 片段。 - 权限检查:可通过注解或拦截器对接口进行权限校验,结合菜单标识与角色集合判断。 **更新** 权限管理现已通过PermissionResolver实现了统一的权限计算,支持多角色权限合并、停用权限点过滤、部门子树展开等高级特性。 ```mermaid classDiagram class AuthUser { +id +username +status } class SysRole { +id +name +code +dataScope } class SysMenu { +id +name +type +permission +perms +status } class SysUserRole { +userId +roleId } class SysRoleMenu { +roleId +menuId } class SysDept { +id +name +parentId } class SysUserDept { +userId +deptId } class DataScopeLevel { +SELF +DEPT +DEPT_AND_CHILDREN +ALL } class PermissionGrant { +visibility +permCodes +roleCodes +asAuthorities() } AuthUser ||--o{ SysUserRole : "拥有" SysRole ||--o{ SysUserRole : "分配给" SysRole ||--o{ SysRoleMenu : "包含" SysMenu ||--o{ SysRoleMenu : "被包含" AuthUser ||--o{ SysUserDept : "属于" SysDept ||--o{ SysUserDept : "包含" PermissionGrant --> DataScopeLevel : 包含 ``` 图表来源 - [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java) - [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java) - [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java) - [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java) - [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java) - [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java) - [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java) - [DataScopeLevel.java](file://crm-base/src/main/java/com/crm/base/security/DataScopeLevel.java) - [PermissionGrant.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionGrant.java) 章节来源 - [ISysRoleService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java) - [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java) - [ISysMenuService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysMenuService.java) - [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java) - [ISysDeptService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysDeptService.java) - [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [DataScopeTables.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeTables.java) - [DataScopeLevel.java](file://crm-base/src/main/java/com/crm/base/security/DataScopeLevel.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) ### 统一权限资源管理功能 **新增** 统一权限资源管理功能提供了完整的资源树CRUD操作,支持目录、菜单、按钮三种类型的层级管理。 - **ResourceController**:提供RESTful API接口,包括资源树查询、新增编辑、删除和图标上传功能 - **ResourceServiceImpl**:实现复杂的业务验证逻辑,包括层级约束、字段必填校验、编辑锁机制 - **ResourceNode**:数据传输对象,支持不同资源类型的字段映射和转换 - **文件上传集成**:与FileApi服务集成,支持图标上传、格式校验和大小限制 ```mermaid sequenceDiagram participant Client as "客户端" participant RC as "ResourceController" participant RSVC as "ResourceServiceImpl" participant SM as "ISysMenuService" participant FR as "FileApi" Client->>RC : "GET /api/resources" RC->>RSVC : "listAll()" RSVC->>SM : "查询所有菜单" SM-->>RSVC : "菜单列表" RSVC-->>RC : "ResourceNode[]扁平数组" RC-->>Client : "资源树数据" Client->>RC : "POST /api/resources (保存节点)" RC->>RSVC : "save(ResourceNode)" RSVC->>RSVC : "验证层级约束" RSVC->>RSVC : "验证字段必填" RSVC->>SM : "saveOrUpdate(entity)" SM-->>RSVC : "保存成功" RSVC-->>RC : "ResourceNode" RC-->>Client : "保存结果" Client->>RC : "POST /api/resources/icon/upload" RC->>RSVC : "uploadIcon(file)" RSVC->>RSVC : "文件格式校验" RSVC->>FR : "upload(content, name, type, domain)" FR-->>RSVC : "FileInfoDTO" RSVC-->>RC : "FileInfoDTO" RC-->>Client : "上传结果" ``` 图表来源 - [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java) - [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java) - [IResourceService.java](file://crm-auth/src/main/java/com/crm/auth/service/IResourceService.java) - [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java) - [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java) **Section sources** - [ResourceController.java:1-48](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java#L1-L48) - [ResourceServiceImpl.java:1-262](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java#L1-L262) - [IResourceService.java:1-26](file://crm-auth/src/main/java/com/crm/auth/service/IResourceService.java#L1-L26) - [ResourceNode.java:1-80](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java#L1-L80) - [FileApi.java:1-106](file://crm-file/src/main/java/com/crm/file/api/FileApi.java#L1-L106) ### 第三方登录与企业级安全集成 - 抽象与工厂:ThirdPartyAuthClient 定义统一接口,ThirdPartyAuthClientFactory 根据类型创建具体客户端。 - 钉钉实现:DingTalkAuthClient 对接钉钉 API,获取用户信息并转换为 ThirdPartyUserInfo。 - **企业级安全特性**:新增组织成员验证系统,通过企业级token管理确保只有组织成员才能登录。 - **Redis缓存优化**:企业级token采用7000秒TTL缓存,减少频繁API调用。 - 集成流程:前端跳转钉钉授权 -> 回调携带 code -> 服务端换取 access_token -> 拉取用户信息 -> **组织成员验证** -> 本地用户绑定/自动注册 -> 签发 JWT。 **更新** 第三方登录现已支持企业级安全验证,通过钉钉组织通讯录API验证用户是否为组织成员。 ```mermaid sequenceDiagram participant Client as "客户端" participant AC as "AuthController" participant AS as "AuthServiceImpl" participant DTAC as "DingTalkAuthClient" participant Redis as "Redis缓存" participant TS as "TokenService" Client->>AC : "GET /auth/thirdparty/dingtalk/callback?code=..." AC->>AS : "thirdPartyLogin(type, code)" AS->>DTAC : "getAccessToken(code)" DTAC-->>AS : "accessToken" AS->>DTAC : "getUserInfo(accessToken)" DTAC-->>AS : "ThirdPartyUserInfo" AS->>DTAC : "isOrgMember(unionId)" DTAC->>Redis : "获取企业级token缓存" alt 缓存命中 Redis-->>DTAC : "corpToken" else 缓存未命中 DTAC->>DTAC : "requestCorpTokenApi()" DTAC->>Redis : "缓存corpToken(TTL : 7000s)" end DTAC->>DTAC : "requestGetByUnionIdApi(corpToken, unionId)" DTAC-->>AS : "组织成员验证结果" AS->>AS : "查找/绑定本地用户" AS->>TS : "createToken(user, roles, dataScope)" TS-->>AC : "token" AC-->>Client : "LoginResultDTO(token)" ``` 图表来源 - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.java) - [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java) - [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) 章节来源 - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.java) - [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java) - [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) ### 用户与会话管理 - 用户上下文:AuthLoginUser 封装用户基本信息、角色、权限、数据权限范围,便于全链路使用。 - 会话策略:推荐无状态 JWT;如需在线用户统计、强制下线等,可在 TokenService 中引入 Redis 做黑名单或在线列表。 - 初始化数据:DataInitializer 用于启动时预置基础角色、菜单、部门等数据。 **更新** 会话管理现已支持滑动过期机制,当剩余有效期不足一半时自动续期,提升用户体验。**数据可见性上下文通过DataVisibilityContext统一管理,确保线程安全。** 章节来源 - [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [DataInitializer.java](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java) - [DataVisibilityContext.java](file://crm-base/src/main/java/com/crm/base/security/DataVisibilityContext.java) ### 用户列表分页查询功能 - 分页参数设计:UserPageParam 支持灵活的查询条件组合,包括用户名模糊搜索、手机号精确匹配、用户状态筛选、部门选择等 - 数据传输优化:UserListDTO 精简了用户信息字段,避免敏感数据泄露,同时包含必要的关联信息 - 统计分析能力:UserStatsVO 提供用户数据的统计分析,帮助管理员了解用户分布和使用情况 - 性能优化:采用 MyBatis Plus 分页插件,支持高效的大数据量分页查询 章节来源 - [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java) - [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java) - [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) ## 依赖关系分析 - 控制器依赖服务层,服务层依赖领域模型与枚举,安全组件贯穿请求生命周期。 - 第三方登录通过工厂解耦不同平台实现,便于扩展。 - 数据权限通过拦截器与表名映射(DataScopeTables)组合,降低对业务代码侵入。 - 用户列表功能通过 DTO 模式解耦查询参数和返回数据,提高代码可维护性。 - **企业级安全特性通过Redis缓存和钉钉API集成,形成独立的安全验证层**。 - **资源管理功能通过ResourceController和ResourceServiceImpl实现,与文件上传服务集成**。 - **权限解析通过PermissionResolver接口解耦,PermissionGrant提供线程安全的权限数据封装**。 ```mermaid graph LR AC["AuthController"] --> AS["AuthServiceImpl"] AC --> AUS["AuthUserServiceImpl"] AC --> AIS["AuthIdentityServiceImpl"] SYSC["SystemController"] --> SRS["SysRoleServiceImpl"] SYSC --> SMS["SysMenuServiceImpl"] SYSC --> SDS["SysDeptServiceImpl"] RC["ResourceController"] --> RSVC["ResourceServiceImpl"] RSVC --> IMS["ISysMenuService"] RSVC --> FileApi["FileApi"] JF["JwtAuthenticationFilter"] --> TS["TokenService"] JF --> PR["PermissionResolver"] PR --> PG["PermissionGrant"] DSI["DataScopeInterceptor"] --> ALU["AuthLoginUser"] DTAC["DingTalkAuthClient"] --> TPACF["ThirdPartyAuthClientFactory"] DTAC --> Redis["Redis缓存"] UPM["UserPageParam"] --> AUS ULDTO["UserListDTO"] --> AC USVO["UserStatsVO"] --> AC RN["ResourceNode"] --> RSVC ``` 图表来源 - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) - [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) - [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java) - [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java) - [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java) - [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java) - [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java) - [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [PermissionResolver.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) - [PermissionGrant.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionGrant.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java) - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java) - [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java) - [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java) - [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java) - [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java) - [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java) 章节来源 - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) - [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java) - [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) - [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java) - [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java) - [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java) - [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java) - [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [PermissionResolver.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) - [PermissionGrant.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionGrant.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java) - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java) - [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java) - [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java) - [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java) - [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java) - [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java) ## 性能考虑 - JWT 解析开销:避免在 TokenService 中进行重型计算;必要时缓存用户角色/权限集合。 - 数据权限 SQL 注入:尽量复用 MyBatis 分页插件与条件构造器,减少字符串拼接带来的性能损耗。 - 第三方登录:对钉钉等外部 API 调用增加超时与重试策略,避免阻塞主线程。 - 缓存策略:对菜单树、角色-权限映射、部门树等热点数据引入缓存(如 Redis)。 - 无状态会话:避免服务端 Session 存储,提升水平扩展能力。 - 分页查询优化:合理使用数据库索引,避免深分页问题,支持大数据量高效查询。 - **企业级token缓存**:钉钉企业级token采用7000秒TTL缓存,显著减少API调用频率。 - **事务优化**:组织准入校验移至事务外执行,避免长时间占用数据库连接。 - **资源管理性能**:资源树查询采用扁平数组返回,前端按需构建树形结构,减少后端计算开销。 - **文件上传优化**:图标上传支持格式和大小校验,避免大文件传输影响系统性能。 - **权限解析优化**:PermissionResolverImpl使用批量查询和缓存机制,减少数据库访问次数。 - **线程安全保证**:PermissionGrant使用不可变集合,避免并发访问时的同步开销。 ## 故障排查指南 - 常见错误 - 401 未认证:检查 Authorization 头格式、Token 是否过期、过滤器链是否生效 - 403 无权限:检查用户角色与接口权限标识是否匹配,菜单权限是否正确配置 - 数据越权:确认 DataScopeEnum 与用户-部门关系是否正确,拦截器是否注入成功 - 第三方登录失败:核对 AppKey/AppSecret、回调地址、网络连通性与签名校验 - **组织成员验证失败**:检查unionId有效性、企业级token状态、钉钉API权限配置 - **Redis缓存异常**:验证Redis连接状态、缓存key正确性、TTL配置合理性 - 分页查询异常:检查分页参数合法性、数据库连接状态、索引使用情况 - **资源管理错误**:检查资源节点层级约束、字段必填校验、编辑锁机制 - **文件上传失败**:验证文件格式、大小限制、FileApi服务可用性 - **权限解析异常**:检查PermissionResolver实现、用户角色数据完整性、菜单权限配置 - 定位手段 - 开启调试日志,查看 JwtAuthenticationFilter 解析过程 - 打印 DataScopeInterceptor 注入的 SQL 片段,验证数据范围 - 检查 SecurityExceptionHandlers 返回的错误码与消息 - **监控企业级token缓存命中率,分析缓存失效原因** - **跟踪组织准入校验流程,定位API调用失败点** - 监控分页查询性能,分析慢查询日志 - **检查资源管理验证逻辑,定位业务规则冲突** - **监控文件上传性能,分析IO瓶颈** - **调试PermissionResolver权限解析过程,检查用户角色和菜单数据** - 修复建议 - 修正白名单配置,避免误放行敏感接口 - 完善用户-角色-部门关联数据 - 优化第三方客户端超时与重试配置 - **配置合理的Redis缓存TTL,避免频繁失效** - **验证钉钉企业级应用权限配置** - 优化分页查询SQL,添加合适的数据库索引 - **调整资源管理验证规则,确保业务逻辑正确** - **优化文件上传配置,支持更大文件和更多格式** - **检查PermissionResolver实现逻辑,确保权限计算准确性** 章节来源 - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java) - [PermissionResolverImpl.java](file://crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java) ## 结论 认证服务模块通过清晰的分层设计与安全组件协作,实现了完整的认证、授权与数据权限控制能力。**最新更新引入的统一权限解析架构和企业级安全特性显著提升了系统的安全性和可靠性**。通过PermissionResolver接口的解耦设计、PermissionGrant值对象的线程安全保障、事务外组织准入校验、Redis缓存机制、增强的错误处理和完善的资源管理功能,系统在保持高性能的同时提供了更强的安全保障。JWT 无状态化提升了可扩展性,RBAC 与数据权限满足企业级权限需求,第三方登录框架便于快速接入新平台,统一的资源管理功能为权限配置提供了灵活的界面支持。建议在部署时关注安全配置、缓存策略、外部依赖稳定性和资源管理验证规则,以获得更好的性能与可靠性。 ## 附录 - 安全最佳实践 - 最小权限原则:仅授予必要角色与菜单权限 - 强口令策略与登录失败锁定 - HTTPS 传输与 Token 短期有效期 - 定期审计角色与权限变更 - **企业级安全验证:确保所有第三方登录用户都是组织成员** - **Redis缓存安全:合理设置TTL,防止敏感信息长期缓存** - **资源管理安全:严格验证资源节点层级关系和字段完整性** - **权限解析安全:确保PermissionResolver实现的正确性和线程安全性** - 自定义扩展方法 - 新增第三方平台:实现 ThirdPartyAuthClient 接口并在工厂中注册 - 扩展数据权限:在 DataScopeInterceptor 中增加新的 DataScopeEnum 分支 - 增强权限校验:在 PermissionConfig 中启用注解式权限控制 - 扩展用户查询条件:在 UserPageParam 中添加新的筛选字段 - **扩展企业级验证:为新平台实现组织成员验证逻辑** - **扩展资源管理:为新资源类型添加验证规则和字段映射** - **扩展权限解析:实现自定义PermissionResolver接口** - 企业级安全配置指南 - **钉钉企业级应用配置:确保开通组织通讯录权限** - **Redis缓存配置:合理设置企业级token TTL为7000秒** - **事务边界管理:确保组织校验不在事务内执行** - **错误处理机制:实现专门的组织成员验证错误码** - **资源管理配置:配置合理的文件上传大小限制和格式白名单** - **性能监控:监控资源管理API响应时间和文件上传性能** - **权限解析配置:确保PermissionResolver的Bean正确注入和配置**