使用shiro加jwttoken方式认证登录,数据库中密码为MD5加密2次,登录后向前端返回token。controller进行登录时报错JWTtoken校验不一致。代码如下:
logincontroller代码
【以下回答由 GPT 生成】
在Shiro中使用JWT Token对加密加盐密码进行认证,可以按照以下步骤来进行操作:
在Shiro中使用JWT Token的方式进行认证登录时,需要验证JWT Token的有效性。具体的步骤如下:
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;
}
// ...
} ```
在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");
}
// ...
}
// ...
} ```
如果在使用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");
}
// ...
}
// ...
} ```
【注意】以上代码只是给出了解决问题的大致思路和示例代码,并不能直接运行。具体的实现需要根据具体的项目需求和环境来进行调整和优化。