JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。JWT包含以下三部分:**Header、Payload、Signature**
header典型的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)。例如:
{
'alg': "HS256",
'typ': "JWT"
}
然后,用Base64对这个JSON编码就得到JWT的第一部分
JWT的第二部分是payload,它包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型: registered, public 和 private。例如:
{
"sub": '1234567890',
"name": 'john',
"admin":true
}
不要在JWT的payload或header中放置敏感信息,除非它们是加密的。
Signature:为了得到签名部分,你必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可。例如:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) secret可以由自己自由指定。
1.编写JWT工具类
public class JWTUtils {
private static final String SIGNATURE = "kanban@2024";
public static String getToken(Map<String, String> map) {
JWTCreator.Builder builder = JWT.create();
# 生成payload部分
map.forEach(builder::withClaim);
Calendar instance = Calendar.getInstance();
instance.add(Calendar.MINUTE, 3);
# 设置失效时间 这里为3分钟
builder.withExpiresAt(instance.getTime());
return builder.sign(Algorithm.HMAC256(SIGNATURE));
}
public static void verify(String token) {
JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
}
}
2.JWT拦截器
@Slf4j
public class JWTInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Map<String, Object> map = new HashMap<>();
String token = null;
String authorizationHeader = request.getHeader("Authorization");
if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
token = authorizationHeader.substring(7);
}
try {
JWTUtils.verify(token);
return true;
} catch (SignatureVerificationException e) {
e.printStackTrace();
map.put("msg", "无效签名");
} catch (TokenExpiredException e) {
e.printStackTrace();
map.put("msg", "token过期");
} catch (AlgorithmMismatchException e) {
e.printStackTrace();
map.put("msg", "token算法不一致");
} catch (Exception e) {
e.printStackTrace();
map.put("msg", "token失效");
}
map.put("state", false);
String json = new ObjectMapper().writeValueAsString(map);
response.setContentType("application/json;charset=UTF-8");
response.getWriter().print(json);
return false;
}
}
3.WebMvcConfigurer
@Configuration
@EnableWebMvc
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JWTInterceptor())
# 配置拦截所有路径请求
.addPathPatterns("/**")
# 静态资源不需要拦截 包括登录和swagger资源
.excludePathPatterns("/swagger-ui/**","/login/getLogin/**", "/swagger-resources/**", "/webjars/**", "/v3/**", "/swagger-ui.html/**");
}
}
4.配置SpringdocConfig
@Configuration
public class SpringdocConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.components(new Components()
.addSecuritySchemes("authScheme", new SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.bearerFormat("JWT")
.scheme("Bearer")))
.info(new Info()
.title("")
.version("")
.description("")
.contact(new Contact()
.name("")
.email("")));
}
}
5.在controller层增加注解
@Operation(summary = "删除用户",security = @SecurityRequirement(name = "authScheme"))