shiro中使用JWTtoken对加密加盐密码如何进行认证

使用shiro加jwttoken方式认证登录,数据库中密码为MD5加密2次,登录后向前端返回token。controller进行登录时报错JWTtoken校验不一致。代码如下:

logincontroller代码

img


myrealm代码

img

img


请问JWTtoken方式如何验证token,myrealm中doGetAuthenticationInfo方法如何返回SimpleAuthenticationInfo
加盐时也同样报这个错,去掉盐后,仍然报错
Submitted credentials for token [.shiro.JwtToken@1e84a4d2] did not match the expected credentials.

【以下回答由 GPT 生成】

解决方案

在Shiro中使用JWT Token对加密加盐密码进行认证,可以按照以下步骤来进行操作:

1. 验证JWT Token的有效性

在Shiro中使用JWT Token的方式进行认证登录时,需要验证JWT Token的有效性。具体的步骤如下:

  • 在Shiro的配置文件中,配置一个JWTFilter,用来进行JWT Token的验证。

```java // JWTFilter.java public class JWTFilter extends AdviceFilter {

  @Override
  protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
      HttpServletRequest httpRequest = (HttpServletRequest) request;
      String token = httpRequest.getHeader("Authorization");

      // 验证JWT Token的有效性的代码逻辑

      return true;
  }

  // ...

} ```

  • preHandle方法中,通过httpRequest.getHeader("Authorization")获取到请求头中的Authorization字段,得到JWT Token。

  • 对获取到的JWT Token进行验证,例如使用第三方库jjwt进行解析和验证。

```java // JWTFilter.java public class JWTFilter extends AdviceFilter {

  @Override
  protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
      // ...

      // 解析和验证JWT Token的代码逻辑
      try {
          String secret = "your-secret-key";
          Jws<Claims> claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token);

          // 验证通过
      } catch (JwtException | IllegalArgumentException e) {
          // 验证失败返回错误信息
          HttpServletResponse httpResponse = (HttpServletResponse) response;
          httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
          httpResponse.getWriter().print("Invalid JWT Token");
          return false;
      }

      return true;
  }

  // ...

} ```

2. 在myrealm中的doGetAuthenticationInfo方法进行密码验证

在Shiro的自定义Realm(myrealm)中的doGetAuthenticationInfo方法中,可以对加密加盐后的密码进行验证。具体的步骤如下:

  • doGetAuthenticationInfo方法中,获取到用户输入的用户名和密码。

```java // MyRealm.java public class MyRealm extends AuthorizingRealm {

  @Override
  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
      UsernamePasswordToken upToken = (UsernamePasswordToken) token;
      String username = upToken.getUsername();
      char[] password = upToken.getPassword();

      // 对加密加盐密码进行验证的代码逻辑

      // ...
  }

  // ...

} ```

  • 对获取到的用户名和密码进行验证,例如查询数据库获取到该用户的加密加盐密码。

```java // MyRealm.java public class MyRealm extends AuthorizingRealm {

  @Override
  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
      // ...

      // 获取到该用户的加密加盐密码
      String salt = "your-salt";
      String storedPassword = "your-stored-password"; // 从数据库查询得到的加密加盐密码

      // 将用户输入的密码进行加密加盐
      String inputPassword = new String(password);
      String hashedPassword = HashUtils.getHashedPassword(inputPassword, salt); // 假设此方法用来对密码进行加密加盐

      // 验证密码是否匹配
      if (!storedPassword.equals(hashedPassword)) {
          throw new IncorrectCredentialsException("Incorrect password");
      }

      // ...
  }

  // ...

} ```

3. 处理加盐导致的错误

如果在使用Shiro的加盐功能时,出现错误提示Submitted credentials for token did not match the expected credentials,可以按照以下步骤来处理:

  • 确认数据库中存储的密码是经过MD5加密2次的密码,与Shiro的加盐密码格式一致。

  • 确认在加盐前后的密码经过了相同的加密算法,例如都是使用MD5进行加密。

  • 确认在加盐时使用的盐值是一致的。

```java // MyRealm.java public class MyRealm extends AuthorizingRealm {

  @Override
  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
      // ...

      // 获取到该用户的加密加盐密码
      String salt = "your-salt";
      String storedPassword = "your-stored-password"; // 从数据库查询得到的加密加盐密码

      // 将用户输入的密码进行加密加盐
      String inputPassword = new String(password);
      String hashedPassword = HashUtils.getHashedPassword(inputPassword, salt); // 假设此方法用来对密码进行加密加盐

      // 验证密码是否匹配
      if (!storedPassword.equals(hashedPassword)) {
          throw new IncorrectCredentialsException("Incorrect password");
      }

      // ...
  }

  // ...

} ```

【注意】以上代码只是给出了解决问题的大致思路和示例代码,并不能直接运行。具体的实现需要根据具体的项目需求和环境来进行调整和优化。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^