Springboot2.3.5 实现JWT授权验证并针对不同用户实现多个拦截器
2021/8/6 6:08:20
本文主要是介绍Springboot2.3.5 实现JWT授权验证并针对不同用户实现多个拦截器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
参考
- Spring Boot 拦截器无效,不起作用
- 拦截器不生效
- SpringBoot 多个拦截器配置
- SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?
- Spring Boot教程:SpringBoot整合JWT
注意
如果你的拦截器不生效,检查一下拦截规则,比如拦截 student/所有,配置相对拦截规则就是 /student/**
/** * 学生拦截器 */ registry.addInterceptor(new JWTStudentInterceptor()) /** * 拦截的路径,路径匹配规则要注意,匹配所有是 ** ,而不是一个 * */ .addPathPatterns("/student/**") /** * 排除登录接口 */ .excludePathPatterns("/student/v1/auth/**","/student/v1/register/**");
正文
- pom.xml 文件新增jwt扩展
<!-- 引入jwt--> <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt --> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.18.1</version> </dependency>
- 创建jwt工具类,Student是学生实体,因为本项目存在多种用户 老师、学生,所以就给他们区分开获取token以及验证token的方法。
/** * @Author 夏秋初 * @Date 2021/8/5 22:45 * 参考: * https://blog.csdn.net/weixin_42654295/article/details/109280627 * https://blog.csdn.net/qq_37059838/article/details/87859810 */ public class JWTUtils { /** * 默认令牌过期时间7天 */ public static String getStudentToken(Student student){ Calendar instance = Calendar.getInstance(); instance.add(Calendar.DATE,7); JWTCreator.Builder builder = JWT.create(); // 储存用户id,可以储存多个参数 builder.withClaim("studentId",student.getId()); // 可以通过 JWT.decode(token).getClaim("储存时候的key"),进行获取 // builder.withClaim("studentId",student.getName()); // 通过账号确认唯一 String token = builder.withExpiresAt(instance.getTime()) .sign(Algorithm.HMAC256(student.getAccount())); return token; } /** * 验证token合法性 成功返回token * @param token * @return */ public static DecodedJWT verifyStudentToken(String token, String account){ JWTVerifier build = JWT.require(Algorithm.HMAC256(account)).build(); return build.verify(token); } /** * 解密jwt */ public static DecodedJWT decodeJWT(String token){ return JWT.decode(token); } }
- 控制器内调用,即可获取jwt字符串
JWTUtils.getStudentToken(student)
- interceptor/新增自定义拦截器,因为有多种用户,这里的拦截器针对学生的
@Component public class JWTStudentInterceptor implements HandlerInterceptor { @Autowired StudentService studentService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("进入JWT拦截器了"); String token = request.getHeader("JWT"); DecodedJWT decodeJWT = JWTUtils.decodeJWT(token); Integer id = decodeJWT.getClaim("studentId").asInt(); Student student = studentService.findById(id); try { JWTUtils.verifyStudentToken(token, student.getAccount()); }catch (Exception e){ System.out.println("token无效"); return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { // System.out.println("JWT 执行完了"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println("我获取到了一个返回的结果:"+response); System.out.println("请求结束了"); } }
- config/创建拦截器配置类,并注册拦截器实现拦截
@Configuration public class IntercaptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { /** * 学生拦截器 */ registry.addInterceptor(new JWTStudentInterceptor()) /** * 拦截的路径 */ .addPathPatterns("/student/**") /** * 排除登录接口 */ .excludePathPatterns("/student/v1/auth/**","/student/v1/register/**"); /** * 测试多个拦截器 */ // registry.addInterceptor(new TestStudentInterceptor()) // /** // * 拦截的路径 // */ // .addPathPatterns("/test/*"); } }
完毕
这篇关于Springboot2.3.5 实现JWT授权验证并针对不同用户实现多个拦截器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27数据结构与算法面试题详解及练习
- 2024-12-27网络请求面试题详解与实战
- 2024-12-27数据结构和算法面试真题详解与实战教程
- 2024-12-27网络请求面试真题解析与实战教程
- 2024-12-27数据结构和算法大厂面试真题详解与实战指南
- 2024-12-27TS大厂面试真题解析与应对策略
- 2024-12-27TS大厂面试真题详解与解析
- 2024-12-27网站安全入门:如何识别和修复漏洞
- 2024-12-27SQL注入基础教程
- 2024-12-27初学者指南:理解和修复跨域漏洞