模块简介及主要职责
ruoyi-auth 模块是整个系统中的关键安全组件,其主要职责如下:
- 用户认证:负责验证用户的登录凭证,如用户名和密码,确保只有经过身份验证的用户才能访问受保护的资源。
- 权限管理:管理用户权限和角色,确保用户只能访问他们被授权的功能和数据。
- 会话管理:维护用户的会话状态,跟踪用户在系统中的活动,并在必要时注销用户会话。
- 令牌生成与验证:生成和验证用于后续请求的身份令牌,如 JWT(JSON Web Tokens)。
- API 安全性:提供安全层来保护 API 调用,防止未授权访问。
ruoyi-auth模块作为认证和授权的核心组件,在整个系统架构中扮演着至关重要的角色。
原理及流程分析
1.登录认证即系统登录用户的认证过程。
TokenController控制器login方法会进行用户验证,如果验证通过会保存登录日志并返回token,同时缓存中会存入login_tokens:xxxxxx(包含用户、权限信息)。
2.刷新令牌就是对系统操作用户进行缓存刷新,防止过期。
TokenController控制器refresh方法会在用户调用时更新令牌有效期。
3.用户注销是系统登录用户的退出过程。
TokenController控制器logout方法会在用户退出时删除缓存信息同时保存用户退出日志。
源码解读
引入依赖
在该依赖中包含nacos注册发现、配置、sentinel、web、Actuator、ruoyi-common-security等依赖包,其中ruoyi-auth模块引入ruoyi-common-security子模块,如下:
1.在ruoyi-common-security模块中包含webmvc、ruoyi-system、ruoyi-common-redis等依赖
2.在ruoyi-common-redis模块中包含redis、ruoyi-common-core等依赖
3.在ruoyi-common-core模块中包含OpenFeign、loadBalancer、SpringContextSupport、web、Transmittable ThreadLocal、PageHelper、Hibernate Validator、Jackson、FastJSON、Jwt、jaxb、lang、IO、excel、servlet、swagger等依赖。
编写配置:bootstrap.yml文件
在该配置文件中包该模块的服务端口、应用名称、环境、nacos注册地址、配置中心地址、配置格式以及共享配置文件。
form类(注册和登录实体类)
在用户登录和注册实体类中,注册实体类继承了登录实体类,他们都只有username和password字段以及对应的get和set方法
service包(记录日志类、登录密码逻辑类、用户登录逻辑类)
该服务类通过@Component注解注入到Spring容器中,只用于记录用户登录信息。通过创建登录信息对象记载登录用户的用户名、IP、消息,之后通过日志服务调用对象remoteLogService完成用户登录信息日志记录。 1.SysRecordLogService:该服务类通过@Component注解注入到Spring容器中,用于验证用户密码登录。主要通过Redis根据用户名获取Redis缓存的key,通过该key将输入密码错误次数作为值,并设置过期时间缓存在Redis中。验证完成后,清除Redis中的缓存。
2.SysPasswordService:该服务类是通过@Component注解注入到Spring容器中,该类包含用户注册、登录、注销流程。
3.SysLoginService:注册流程主要是检验注册用户/密码是否填写、账户长度、密码长度等问题,接着设置用户信息,并通过远程调用RemoteUserService实现用户注册,并将注册信息记录通过SysRecordLogService实例同步到数据库中。
登录流程主要是检验用户/密码是否填写、用户名和密码是否在指定范围、IP是否在黑名单、登录用户是否存在,是否删除、禁用。然后根据用户信息和密码通过调用passwordService验证密码,最后通过SysRecordLogService实例同步登录日志记录到数据库。
注销流程通过SysRecordLogService实例同步注销日志记录到数据库
TokenController
该类主要根据映射路径进行业务处理并返回业务处理结果。其中包含用户注册、登录、刷新token、注销等操作。
TokenService
该类包含创建token,通过request获取token,通过token获取userKey,然后根据拼接后的userKey从Redis缓存中获取登录用户信息、根据登录用户设置用户信息、通过token删除用户、通过登录用户验证token,通过登录用户刷新令牌,通过userKey获取t拼接后的userKey。
权限认证类
AuthUtil:该类封装了一下方法:根据token注销会话,检验用户是否登录(SecurityContextHandler通过ThreadLocal获取用户信息)、验证用户token有效期、检查用户角色、检查用户权限
权限逻辑实现类
该类是对上述AuthUtils类方法的实现。