认证与授权技术
2025/12/3大约 6 分钟
认证与授权技术
概述
FlowMind 系统采用基于 Spring Cloud Alibaba + JWT 的认证授权机制,认证服务集中在 ruoyi-auth 模块中,实现了前后端分离架构下的安全访问控制。系统支持用户认证、角色授权、接口权限控制等功能,确保系统资源的安全访问。
技术架构
认证流程
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 客户端 │ │ API网关 │ │ 认证服务 │ │ 系统服务 │ │ 数据库 │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
│ │ │ │ │
│ 1. 登录请求 │ │ │ │
├─────────────────────► │ │ │
│ │ 2. 转发登录请求 │ │ │
│ ├─────────────────────► │ │
│ │ │ 3. 验证用户凭证 │ │
│ │ ├─────────────────────► │
│ │ │ 4. 远程调用系统服务 │ │
│ │ │ 查询用户信息 │ │
│ │ ├─────────────────────► │
│ │ │ 5. 返回用户信息 │ │
│ │ ◄─────────────────────┤ │
│ │ │ 6. 验证密码 │ │
│ │ │ 7. 生成JWT令牌 │ │
│ │ │ 8. 缓存用户信息到Redis │ │
│ │ 9. 返回JWT令牌给客户端 │ │ │
│ ◄─────────────────────┤ │ │
│ 10. 返回JWT令牌 │ │ │ │
◄─────────────────────┤ │ │ │
│ │ │ │ │
│ 11. 携带JWT访问API │ │ │ │
├─────────────────────► │ │ │
│ │ 12. 网关验证JWT合法性 │ │ │
│ │ 13. 从Redis获取用户信息 │ │ │
│ │ 14. 转发请求到业务服务 │ │ │
│ ├─────────────────────► │ │
│ │ │ 15. 业务逻辑处理 │ │
│ │ │ 16. 返回API响应 │ │
│ ◄─────────────────────┤ │ │
│ 17. 返回API响应 │ │ │ │
◄─────────────────────┤ │ │ │核心组件
| 组件 | 技术 | 功能描述 |
|---|---|---|
| 认证服务 | Spring Boot | 集中处理用户登录、注册、令牌生成与刷新 |
| 令牌机制 | JWT | 无状态的认证令牌,包含用户标识信息 |
| 缓存服务 | Redis | 存储登录用户信息,提高认证效率 |
| 远程调用 | OpenFeign | 认证服务远程调用系统服务查询用户信息 |
| 网关过滤 | Spring Cloud Gateway | 统一的认证授权入口,验证JWT令牌 |
| 权限管理 | Spring Security + 自定义注解 | 细粒度的接口权限控制 |
核心模块结构
ruoyi-auth 模块结构
ruoyi-auth/
├── src/main/java/com/ruoyi/auth/
│ ├── controller/ # 控制器层
│ │ └── TokenController.java # 令牌相关接口
│ ├── form/ # 请求表单
│ │ ├── LoginBody.java # 登录请求体
│ │ └── RegisterBody.java # 注册请求体
│ ├── service/ # 服务层
│ │ ├── SysLoginService.java # 登录服务
│ │ ├── SysPasswordService.java # 密码服务
│ │ └── SysRecordLogService.java # 日志记录服务
│ └── RuoYiAuthApplication.java # 应用入口
└── src/main/resources/
├── bootstrap.yml # 配置文件
└── logback.xml # 日志配置核心功能实现
1. 令牌控制器 (TokenController)
TokenController 提供了认证相关的REST API接口:
- 登录接口 (
POST /login):处理用户登录请求 - 退出接口 (
DELETE /logout):处理用户退出请求 - 刷新令牌 (
POST /refresh):刷新令牌有效期 - 注册接口 (
POST /register):处理用户注册请求
2. 登录服务 (SysLoginService)
SysLoginService 负责处理登录业务逻辑:
public LoginUser login(String username, String password) {
// 1. 验证用户名密码格式
// 2. IP黑名单校验
// 3. 远程调用系统服务查询用户信息
// 4. 验证用户状态
// 5. 验证密码
// 6. 记录登录日志
// 7. 更新用户登录信息
// 8. 返回登录用户信息
}3. JWT 令牌处理 (JwtUtils)
JwtUtils 是JWT令牌的核心处理工具,位于 ruoyi-common-core 模块:
- createToken():生成JWT令牌
- parseToken():解析JWT令牌,获取Claims
- getUserKey():从令牌中获取用户标识
- getUserName():从令牌中获取用户名
- getUserId():从令牌中获取用户ID
4. 令牌服务 (TokenService)
TokenService 负责令牌的业务逻辑处理,位于 ruoyi-common-security 模块:
- createToken():创建令牌,生成JWT并缓存用户信息
- getLoginUser():获取登录用户信息
- refreshToken():刷新令牌有效期
- delLoginUser():删除登录用户信息
- verifyToken():验证令牌有效性
5. 密码服务 (SysPasswordService)
SysPasswordService 负责密码的加密和验证:
- encryptPassword():加密密码
- validate():验证密码是否匹配
JWT 令牌结构
令牌组成
Header.Payload.SignatureHeader:包含令牌类型和签名算法
{ "alg": "HS512", "typ": "JWT" }Payload:包含核心用户信息
{ "user_key": "user:123", "user_id": "123", "username": "admin", "exp": 1672531199, "iat": 1672527599 }Signature:使用密钥签名,确保令牌完整性
令牌生成与验证流程
生成流程:
- 登录成功后,TokenService创建UUID作为token
- 将用户信息存入Redis,key为
login_tokens:${token} - 使用JwtUtils生成JWT,包含user_key等核心信息
- 返回JWT给客户端
验证流程:
- 客户端携带JWT请求API
- 网关过滤器提取JWT
- 解析JWT获取user_key
- 从Redis获取完整用户信息
- 验证通过后转发请求
权限控制
基于角色的访问控制 (RBAC)
系统采用RBAC模型实现权限控制:
角色定义:
- 超级管理员(ROLE_ADMIN)
- 系统管理员(ROLE_SYSTEM)
- 普通用户(ROLE_USER)
- 审批人(ROLE_APPROVER)
权限定义:
- 菜单权限:控制用户可见的菜单和页面
- 按钮权限:控制用户可操作的按钮
- 接口权限:控制用户可访问的API接口
接口权限控制
系统使用自定义注解实现细粒度权限控制:
// 自定义权限注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@PreAuthorize("@ss.hasPermi(#permission)")
public @interface RequiresPermissions {
String value();
}安全配置
认证服务配置
bootstrap.yml 核心配置:
spring:
cloud:
nacos:
discovery: # 服务注册
server-addr: localhost:8848
config: # 配置中心
server-addr: localhost:8848
file-extension: yml
shared-configs:
- data-id: ruoyi-common.yml
# 认证配置
auth:
# 无需认证的路径
ignore-urls:
- /auth/login
- /auth/logout
- /auth/refresh
- /auth/register性能优化
缓存机制:
- 使用Redis缓存登录用户信息,减少数据库访问
- 令牌有效期和刷新机制,平衡安全性和用户体验
令牌设计:
- JWT仅包含核心用户标识,减少令牌大小
- 详细用户信息存储在Redis中,提高访问效率
远程调用优化:
- 使用Feign进行服务间调用,配置合理的超时时间
- 服务间通信采用HTTP/2或gRPC,提高传输效率
监控与日志
登录日志
系统记录详细的登录日志,包括:
- 登录用户名
- 登录时间
- 登录IP
- 登录状态(成功/失败)
- 失败原因
操作日志
系统记录用户的重要操作日志,包括:
- 操作人
- 操作时间
- 操作IP
- 操作类型
- 操作描述
- 操作结果
安全最佳实践
密码安全:
- 使用BCrypt算法加密存储密码
- 密码长度限制在5-20个字符
- 定期要求用户修改密码
令牌安全:
- 使用HTTPS协议传输令牌
- 设置合理的令牌过期时间
- 支持令牌刷新机制
- 实现令牌黑名单机制
访问控制:
- 最小权限原则,只授予必要的权限
- 定期审计权限配置
- 实现接口级别的细粒度权限控制
防御机制:
- IP黑名单机制,防止恶意登录
- 请求限流,防止暴力攻击
- 参数校验,防止SQL注入和XSS攻击
总结
FlowMind 系统的认证授权机制基于 Spring Cloud Alibaba + JWT 实现,具有以下特点:
- 集中式认证:认证服务独立部署,便于管理和扩展
- 无状态设计:基于JWT的认证机制,减少服务器端状态管理
- 高性能:使用Redis缓存用户信息,提高认证效率
- 细粒度权限控制:支持基于角色和权限的访问控制
- 安全性高:实现了完整的安全防御机制
- 易于集成:标准化的认证流程,便于与其他系统集成
通过这套认证授权机制,FlowMind 系统能够为企业提供安全、可靠的工作流管理服务,保障系统资源的安全访问。