String token = request.getHeader("token");userId = JWT.decode(token).getAudience().get(0);
时间: 2024-05-23 21:11:29 浏览: 182
这段代码是从HTTP请求头中获取了一个名为"token"的值,并将其解码为JWT格式的token,然后从其中获取了"audience"字段的第一个值作为userId。
JWT是一种基于JSON的Web令牌,用于在不同系统之间传递认证信息。它由三个部分组成:头部、有效载荷和签名。头部通常包含算法和其他元数据,有效载荷则包含要传输的信息,签名则用于验证信息的完整性和真实性。
因此,这段代码的作用是从HTTP请求头中获取一个JWT格式的token,并解析其中的信息以获取userID,用于进行后续的认证和授权操作。
相关问题
public class JwtInterceptor implements HandlerInterceptor { @Autowired private IUserService userService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String token = request.getHeader("token"); if (StrUtil.isBlank(token)) { token = request.getParameter("token"); } // 如果不是映射到方法直接通过 if(handler instanceof HandlerMethod) { AuthAccess annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthAccess.class); if (annotation != null) { return true; } } // 执行认证 if (StrUtil.isBlank(token)) { throw new ServiceException(Constants.CODE_401, "无token,请重新登录"); } // 获取 token 中的 user id String userId; try { userId = JWT.decode(token).getAudience().get(0); } catch (JWTDecodeException j) { throw new ServiceException(Constants.CODE_401, "token验证失败,请重新登录"); } // 根据token中的userid查询数据库 User user = userService.getById(userId); if (user == null) { throw new ServiceException(Constants.CODE_401, "用户不存在,请重新登录"); } // 用户密码加签验证 token JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build(); try { jwtVerifier.verify(token); // 验证token } catch (JWTVerificationException e) { throw new ServiceException(Constants.CODE_401, "token验证失败,请重新登录"); } return true; } }
这是一个基于Spring框架的JWT认证拦截器,主要作用是在接口方法执行前对请求进行认证,确保请求的合法性。
具体实现过程如下:
1. 首先从请求头或请求参数中获取token。
2. 判断请求是否是映射到方法,如果不是直接通过。
3. 如果是映射到方法,判断方法上是否有注解@AuthAccess,如果有直接通过。
4. 如果没有@AuthAccess注解,则需要执行认证。
5. 如果没有token,抛出异常,提示无token,请重新登录。
6. 如果有token,从token中解析出用户ID,查询数据库获取用户信息。
7. 如果用户不存在,抛出异常,提示用户不存在,请重新登录。
8. 如果用户存在,使用用户密码对token进行加签验证,确保token的合法性。
9. 如果token验证失败,抛出异常,提示token验证失败,请重新登录。
10. 如果token验证成功,返回true表示通过认证,接口方法可以执行。
Springboot写一个拦截器拦截所有,如果没有token就验证用户名与密码,然后签发一个token返回给前端,如果已经有token则检验是否是签发给当前用户的
好的,下面是SpringBoot拦截器的实现方式:
1. 首先创建一个拦截器类,实现HandlerInterceptor接口,重写其中的三个方法preHandle、postHandle、afterCompletion。其中preHandle方法在请求处理之前被调用,返回值为true则继续执行后面的请求处理,为false则不执行后面的请求处理。
```
public class TokenInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token == null) {
// 如果请求头中没有Authorization信息则直接返回
throw new UnauthorizedException("没有权限访问该资源");
}
if (!JwtUtil.verify(token)) {
// 如果验证token失败则返回
throw new UnauthorizedException("token验证失败");
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
```
2. 在配置类中配置拦截器,使用addInterceptors方法添加拦截器,并设置拦截器的拦截路径。
```
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TokenInterceptor())
.addPathPatterns("/**");
}
}
```
3. 在方法中获取请求头中的token,如果没有则验证用户名和密码,如果验证通过则签发一个token并返回给前端。
```
@PostMapping("/login")
public ResponseData login(@RequestBody User user) {
User loginUser = userService.login(user.getUsername(), user.getPassword());
if (loginUser == null) {
throw new UnauthorizedException("用户名或密码错误");
}
String token = JwtUtil.sign(loginUser.getId(), loginUser.getUsername(), loginUser.getPassword());
return ResponseData.success(token);
}
```
4. 在验证token的方法中判断token是否是签发给当前用户的。
```
public static boolean verify(String token) {
try {
Algorithm algorithm = Algorithm.HMAC256(SECRET);
JWTVerifier verifier = JWT.require(algorithm)
.withClaim("username", getUsername(token))
.withClaim("password", getPassword(token))
.build();
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception e) {
return false;
}
}
private static String getUsername(String token) {
DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim("username").asString();
}
private static String getPassword(String token) {
DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim("password").asString();
}
```
注意:在签发token时,可以把用户的一些信息加入到token中,比如id、用户名等,验证token时可以通过这些信息进行验证。
阅读全文