用户安全
密码加密存储
用户的密码经过哈希加密后存储在数据库中,关键代码如下
String gensalt = BCrypt.gensalt();// 生成盐值,用于加密密码 |
使用双token机制
双Token机制使用两种令牌(即Token)来管理用户的身份验证和授权过程: assess token 和 refresh token。assess token是短期有效的令牌,用于授权用户访问受保护的资源。每次用户请求时,assess token会携带在请求的头部(Authorization
头)进行身份验证。它的有效期通常比较短,因此能降低令牌被盗用后的风险。refresh token长期有效,用于获取新的assess token。当assess token过期时,客户端可以使用refresh token向认证服务器请求新的assess token。refresh token通常会有较长的有效期(例如几天、几周或几个月),并且只在用户的登录会话中使用。它不会频繁地发送到服务器,只在需要刷新assess token时使用。
优点:
- 提高安全性::assess token即使被盗用,攻击者能够使用它的时间也非常有限。过期后,用户需要使用refresh token刷新assess token,从而限制了assess token的暴露风险。
- 改善用户体验:在assess token过期时,客户端可以使用refresh token自动刷新assess token,而无需用户重新登录,提供了无缝的体验。同时,只要refresh token有效,用户就可以在不干扰操作的情况下保持登录状态,减少登录频率。
- 提高系统性能、减少身份验证负担
- 灵活、可扩展性
关键代码
利用了Spring Security做安全访问控制,相关配置在config/SecurityConfig
下:
具体流程如下:
注册请求
- 用户提交注册请求。
BUserController
的register
方法处理请求,保存用户信息到数据库。
登录请求
- 用户提交登录表单,表单数据会被发送到
SecurityConfig
中配置的loginProcessingUrl
。 - Spring Security 会使用配置的
UserDetailsService
加载用户信息。 - Spring Security 会使用配置的
BCryptPasswordEncoder
验证用户密码。 - 如果验证成功,Spring Security 调用
LoginSuccessHandler
中的onAuthenticationSuccess
方法,生成accessToken
和refreshToken
,并返回给前端。 - 前端保存
accessToken
和refreshToken
。
其他请求
- 用户提交请求,携带
accessToken
。 RequestAuthenticationFilter
拦截请求,验证accessToken
。- 如果
accessToken
有效,解析token并设置用户的认证信息。 - 如果
accessToken
过期,使用refreshToken
生成新的accessToken
和refreshToken
,并保存到Redis中。 - 请求继续执行,返回结果。