Appearance
用户权限管理
**本文引用的文件** - [LemesAuthApplication.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/LemesAuthApplication.java) - [AuthorizationServerConfig.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/config/AuthorizationServerConfig.java) - [SysLoginController.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/controller/SysLoginController.java) - [CustomUserDetailsServiceImpl.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/CustomUserDetailsServiceImpl.java) - [ResourceServerAutoConfiguration.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/ResourceServerAutoConfiguration.java) - [CustomUserDetails.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/util/CustomUserDetails.java) - [CustomUserDetailsDTO.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/util/CustomUserDetailsDTO.java) - [LemesAuthProperties.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/LemesAuthProperties.java) - [SecurityConstants.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/constant/SecurityConstants.java) - [OauthCliendetails.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/tools/entity/auth/OauthCliendetails.java)目录
引言
本技术文档围绕用户权限管理系统展开,重点阐释认证与授权机制的实现原理,涵盖以下方面:
- JWT 令牌管理与 OAuth2 集成
- 基于角色的访问控制(RBAC)与菜单权限控制
- 数据权限过滤与资源服务端鉴权
- 用户管理 API 的完整接口说明
- 在其他服务中集成认证与权限验证的最佳实践
- 安全最佳实践与性能优化建议
该系统采用 Spring Boot + Spring Security + Spring Authorization Server + OAuth2 资源服务器模式,结合自定义用户详情模型与客户端属性配置,形成统一的认证与授权基础设施。
项目结构
本项目采用多模块分层组织,权限相关能力主要分布在如下模块:
- 权限服务(lemes-auth):负责认证服务器、令牌签发与刷新、登录与登出接口
- 权限框架(lemes-framework-auth):提供资源服务器配置、用户详情模型、安全常量、客户端属性等
- 通用业务模块(lemes-service-dm-common-common):包含 OAuth 客户端配置实体,用于存储客户端信息
图表来源
- LemesAuthApplication.java:1-18
- AuthorizationServerConfig.java:1-152
- SysLoginController.java:1-143
- CustomUserDetailsServiceImpl.java:1-33
- ResourceServerAutoConfiguration.java:1-61
- CustomUserDetails.java:1-74
- CustomUserDetailsDTO.java:1-25
- LemesAuthProperties.java:1-33
- SecurityConstants.java:1-34
- OauthCliendetails.java:1-89
章节来源
- LemesAuthApplication.java:1-18
- AuthorizationServerConfig.java:1-152
- SysLoginController.java:1-143
- CustomUserDetailsServiceImpl.java:1-33
- ResourceServerAutoConfiguration.java:1-61
- CustomUserDetails.java:1-74
- CustomUserDetailsDTO.java:1-25
- LemesAuthProperties.java:1-33
- SecurityConstants.java:1-34
- OauthCliendetails.java:1-89
核心组件
应用入口与扫描路径
- 应用入口类通过包扫描加载权限相关组件,启用服务发现与 Feign 客户端配置。
- 参考路径:LemesAuthApplication.java:1-18
认证服务器配置
- 配置 OAuth2 授权端点转换器、认证提供者、令牌生成器与增强器、资源服务器的不透明令牌内省器、异常处理与放行路径。
- 参考路径:AuthorizationServerConfig.java:1-152
登录控制器
- 提供密码登录、登出、刷新令牌与列出在线用户的接口;根据终端标识选择客户端属性,支持同账号多地登录场景。
- 参考路径:SysLoginController.java:1-143
用户详情加载
- 通过 Feign 客户端从用户服务加载用户详情,构建包含菜单列表、权限集合、部门与上级等信息的自定义用户对象。
- 参考路径:CustomUserDetailsServiceImpl.java:1-33
资源服务器配置
- 将系统作为 OAuth2 资源服务器,使用不透明令牌内省器进行令牌校验,并配置放行路径与异常处理。
- 参考路径:ResourceServerAutoConfiguration.java:1-61
用户详情模型与 DTO
- 自定义用户详情类承载用户 ID、菜单列表、权限集合、姓名、API Token、部门与上级等字段;用户详情 DTO 继承基础用户实体并扩展权限与菜单。
- 参考路径:
认证属性与安全常量
- 定义客户端映射、令牌前缀、特殊用户配置等;提供 OAuth2 授权类型常量与令牌前缀等常量。
- 参考路径:
OAuth 客户端实体
- 存储 OAuth 客户端的关键信息,如客户端 ID、资源 ID、密钥、授权范围、授权类型、重定向地址、权限、有效期等。
- 参考路径:OauthCliendetails.java:1-89
章节来源
- LemesAuthApplication.java:1-18
- AuthorizationServerConfig.java:1-152
- SysLoginController.java:1-143
- CustomUserDetailsServiceImpl.java:1-33
- ResourceServerAutoConfiguration.java:1-61
- CustomUserDetails.java:1-74
- CustomUserDetailsDTO.java:1-25
- LemesAuthProperties.java:1-33
- SecurityConstants.java:1-34
- OauthCliendetails.java:1-89
架构总览
系统采用“认证服务器 + 资源服务器 + 客户端应用”的三层架构:
- 认证服务器:负责令牌签发、刷新与登出;支持多种授权模式(密码、刷新令牌等)
- 资源服务器:对受保护资源进行鉴权,使用不透明令牌内省器校验令牌有效性
- 客户端应用:通过 Basic 认证调用认证服务器获取令牌,或携带令牌访问受保护资源
图表来源
- AuthorizationServerConfig.java:1-152
- ResourceServerAutoConfiguration.java:1-61
- CustomUserDetailsServiceImpl.java:1-33
- CustomUserDetails.java:1-74
- OauthCliendetails.java:1-89
详细组件分析
认证服务器配置(AuthorizationServerConfig)
- 功能要点
- 配置 OAuth2 授权端点的请求转换器,支持授权码、刷新令牌、客户端凭证与密码模式
- 注册密码模式认证提供者与自定义成功/失败处理器
- 配置令牌生成器与增强器,向访问令牌中注入用户相关信息
- 配置资源服务器使用不透明令牌内省器,设置放行路径与异常处理
- 提供密码编码器与认证服务器设置 Bean
图表来源
章节来源
登录控制器(SysLoginController)
- 功能要点
- 密码登录:根据终端标识选择客户端属性,支持同账号多地登录;若已存在有效授权则直接返回令牌,否则调用认证服务器获取
- 登出:解析 Bearer 令牌,查找对应授权并移除
- 刷新令牌:基于刷新令牌调用认证服务器刷新访问令牌
- 列出在线用户:通过 Redis 键空间扫描当前登录用户
图表来源
章节来源
用户详情加载(CustomUserDetailsServiceImpl)
- 功能要点
- 通过 Feign 客户端加载用户详情 DTO
- 构建包含用户 ID、用户名、菜单列表、密码、权限集合、姓名、API Token、部门与上级的自定义用户对象
- 若未找到用户则抛出用户名不存在异常
图表来源
章节来源
资源服务器配置(ResourceServerAutoConfiguration)
- 功能要点
- 启用 Web 安全与方法级权限注解
- 配置不透明令牌内省器与异常处理
- 放行指定路径,其余请求均需认证
图表来源
章节来源
用户详情模型与 DTO(CustomUserDetails / CustomUserDetailsDTO)
- 功能要点
- 自定义用户详情类继承 Spring Security User,扩展用户 ID、菜单列表、API Token、部门与上级等字段
- 用户详情 DTO 继承基础用户实体,新增权限集合与菜单列表字段
图表来源
章节来源
OAuth 客户端实体(OauthCliendetails)
- 字段说明
- 客户端 ID、资源 ID、客户端密钥、授权范围、授权类型、重定向地址、权限、访问令牌有效期、刷新令牌有效期、附加信息、自动授权标志等
- 用途
- 存储 OAuth 客户端配置,供认证服务器识别与校验客户端
图表来源
章节来源
依赖分析
- 组件耦合
- 认证服务器配置依赖用户详情服务、不透明令牌内省器与放行路径配置
- 登录控制器依赖认证属性配置、授权服务与认证服务器客户端
- 资源服务器配置依赖不透明令牌内省器与放行路径配置
- 用户详情加载依赖用户服务 Feign 客户端与自定义用户详情模型
- 外部依赖
- Spring Security、Spring Authorization Server、Spring Cloud OpenFeign、BCrypt 密码编码器
图表来源
- AuthorizationServerConfig.java:1-152
- ResourceServerAutoConfiguration.java:1-61
- SysLoginController.java:1-143
- CustomUserDetailsServiceImpl.java:1-33
- CustomUserDetails.java:1-74
- CustomUserDetailsDTO.java:1-25
- OauthCliendetails.java:1-89
章节来源
- AuthorizationServerConfig.java:1-152
- ResourceServerAutoConfiguration.java:1-61
- SysLoginController.java:1-143
- CustomUserDetailsServiceImpl.java:1-33
- CustomUserDetails.java:1-74
- CustomUserDetailsDTO.java:1-25
- OauthCliendetails.java:1-89
性能考虑
- 令牌复用与缓存
- 登录时优先检查是否存在已存在的授权,避免重复调用认证服务器,降低延迟与数据库压力
- 参考路径:SysLoginController.java:74-84
- 密码编码强度
- 使用 BCrypt 进行密码编码,兼顾安全性与性能
- 参考路径:AuthorizationServerConfig.java:147-149
- 不透明令牌内省
- 资源服务器使用不透明令牌内省器进行令牌校验,减少本地状态维护成本
- 参考路径:ResourceServerAutoConfiguration.java:51-54
- 方法级权限与放行路径
- 明确放行路径,减少不必要的鉴权开销
- 参考路径:ResourceServerAutoConfiguration.java:46-49
[本节为通用性能建议,无需具体文件分析]
故障排查指南
- 登录失败
- 检查终端标识对应的客户端属性是否存在,确认客户端 ID 与密钥正确
- 参考路径:SysLoginController.java:58-62
- 令牌无效或过期
- 使用刷新令牌接口刷新访问令牌;若刷新失败,检查刷新令牌是否仍有效
- 参考路径:SysLoginController.java:112-126
- 资源访问被拒绝
- 确认请求头携带正确的 Bearer 令牌;检查资源服务器配置与不透明令牌内省器
- 参考路径:ResourceServerAutoConfiguration.java:51-54
- 用户详情加载失败
- 检查用户服务是否可用;确认用户详情 DTO 是否包含必要的权限与菜单信息
- 参考路径:CustomUserDetailsServiceImpl.java:23-31
章节来源
- SysLoginController.java:1-143
- ResourceServerAutoConfiguration.java:1-61
- CustomUserDetailsServiceImpl.java:1-33
结论
本权限管理系统通过认证服务器与资源服务器的协同,实现了完善的 OAuth2 授权与令牌管理;结合自定义用户详情模型与客户端属性配置,满足多终端、多租户与多地登录的复杂场景需求。系统在安全性与可扩展性之间取得平衡,适合在微服务架构中作为统一的认证与授权基础设施。
[本节为总结性内容,无需具体文件分析]
附录
用户管理 API 接口文档
密码登录
- 方法与路径:POST /auth/pwdLogin
- 请求头:TERMINAL(终端标识)
- 参数:username(用户名)、password(密码)
- 行为:根据终端选择客户端属性;若存在有效授权则直接返回令牌,否则调用认证服务器获取
- 参考路径:SysLoginController.java:55-85
登出
- 方法与路径:DELETE /auth/logoff
- 请求头:Authorization(Bearer 令牌)
- 行为:解析令牌并移除对应授权
- 参考路径:SysLoginController.java:87-103
刷新令牌
- 方法与路径:POST /auth/refreshToken
- 请求头:TERMINAL(终端标识)
- 参数:grant_type=refresh_token(刷新令牌)
- 行为:调用认证服务器刷新访问令牌
- 参考路径:SysLoginController.java:111-126
列出在线用户
- 方法与路径:GET /auth/listLoginUser
- 权限:需要特定自定义权限
- 行为:扫描 Redis 键空间,返回当前登录用户列表
- 参考路径:SysLoginController.java:135-140
章节来源
集成指南(在其他服务中)
- 作为资源服务器
- 引入资源服务器配置类,配置不透明令牌内省器与放行路径
- 参考路径:ResourceServerAutoConfiguration.java:1-61
- 作为客户端
- 使用 Basic 认证调用认证服务器的令牌端点获取访问令牌
- 在请求头中携带 Bearer 令牌访问受保护资源
- 参考路径:AuthorizationServerConfig.java:72-88
章节来源
安全最佳实践
- 密码安全
- 使用 BCrypt 编码存储密码,定期轮换密钥
- 参考路径:AuthorizationServerConfig.java:147-149
- 令牌管理
- 合理设置访问令牌与刷新令牌有效期;及时清理过期授权
- 参考路径:AuthorizationServerConfig.java:119-125
- 权限控制
- 使用方法级权限注解与菜单权限控制,最小化权限暴露面
- 参考路径:ResourceServerAutoConfiguration.java:29-29
章节来源