双token


用户安全

密码加密存储

用户的密码经过哈希加密后存储在数据库中,关键代码如下

String gensalt = BCrypt.gensalt();// 生成盐值,用于加密密码
String hashpw = BCrypt.hashpw(bUser.getPassword(), gensalt); // 使用生成的盐值对用户输入的密码进行哈希加密
bUser.setPassword(hashpw);

使用双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下:

image-20241210113901969

具体流程如下:

注册请求

  1. 用户提交注册请求。
  2. BUserControllerregister方法处理请求,保存用户信息到数据库。

登录请求

  1. 用户提交登录表单,表单数据会被发送到 SecurityConfig 中配置的 loginProcessingUrl
  2. Spring Security 会使用配置的 UserDetailsService 加载用户信息。
  3. Spring Security 会使用配置的 BCryptPasswordEncoder 验证用户密码。
  4. 如果验证成功,Spring Security 调用 LoginSuccessHandler 中的 onAuthenticationSuccess 方法,生成accessTokenrefreshToken,并返回给前端。
  5. 前端保存accessTokenrefreshToken

其他请求

  1. 用户提交请求,携带accessToken
  2. RequestAuthenticationFilter拦截请求,验证accessToken
  3. 如果accessToken有效,解析token并设置用户的认证信息。
  4. 如果accessToken过期,使用refreshToken生成新的accessTokenrefreshToken,并保存到Redis中。
  5. 请求继续执行,返回结果。

Author: CuberSugar
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source CuberSugar !
  TOC