Day06 权限认证-项目集成SpringSecurity
一、登录功能实现
二、LoginServiceImpl的login方法思路
功能描述
- 用户认证:
验证用户提供的用户名和密码是否正确。
使用 Spring Security 的 AuthenticationManager 来完成认证。 - 加载用户信息:
查询用户的角色和资源权限信息,并将其封装在返回对象中。 - 生成 Token:
生成一个用户令牌(userToken)和一个 JWT 令牌(jwtToken)。
将这些令牌存储在 Redis 中,用于后续的权限校验和续期。 - 返回用户数据:
返回用户数据(包括用户角色、资源权限和令牌)以便前端使用。
三、将用户数据存入线程中
思路分析
- 当用户登录成功以后,会下发一个token给前端
- 以后用户每次请求都会携带这个token来进行验证
- 当用户请求其他业务需要当前用户信息的时候,可以直接获取当前登录人信息,比如:创建数据需要知道创建人
所以我们可以使用ThreadLocal来进行存储当前请求(线程)的用户数据,它有两个特点
- 线程之间的隔离
- 同一个线程数据共享
四、自定义授权管理器
JwtAuthorizationManager 是一个授权管理器,它实现了 Spring Security 的 AuthorizationManager 接口,用于处理用户的授权逻辑。
核心功能
JwtAuthorizationManager 的主要职责是:
- 验证用户的 userToken 和 jwtToken。
- 检查用户是否被剔除。
- 根据请求的路径和用户权限,决定是否允许用户访问资源。
- 处理jwtToken 的续期逻辑,确保令牌在接近失效时可以延长有效期。
userToken和jwtToken的作用
userToken:
- 由于 Redis 存储的是 username:userToken,所以 userToken 可以用来快速检索和跟踪当前用户的登录状态。例如,系统可以检查某个 username 是否已有有效的会话(即 username 是否有与之关联的 userToken),以及是否需要为用户重新生成 userToken。这种方式实现了高效的会话管理。
- 同一个用户不同同时登录系统,当同一个用户同时登录,旧的会话会被新的会话剔除,不能继续访问资源。
jwtToken:
- jwtToken包含用户信息,如可访问资源,当用户请求资源时,可通过jwtToken解析出用户信息进行授权认证,而不用访问数据库。
- 无状态的会话管理:与传统的 Session 机制不同,JWT 令牌是无状态的,它不需要在服务器端存储任何会话信息。这意味着,即使服务器或应用重启,JWT 仍然有效,只要没有过期。JWT 可以在不同的服务器或服务之间传递而无需依赖于中心化的会话存储。
- 跨设备认证:用户可以在不同设备之间共享同一个 JWT。只要客户端持有有效的 JWT,用户就可以在任何设备上进行身份验证,而无需重新登录。
本人水平有限,有错的地方还请批评指正。
什么是精神内耗?
简单地说,就是心理戏太多,自己消耗自己。
所谓:
言未出,结局已演千百遍;
身未动,心中已过万重山;
行未果,假想灾难愁不展;
事已闭,过往仍在脑中演。