博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java token认证机制,从零开始的SpringBoot项目 ( 七 ) 实现基于Token的用户身份验证...
阅读量:6362 次
发布时间:2019-06-23

本文共 2401 字,大约阅读时间需要 8 分钟。

importcom.auth0.jwt.JWT;importcom.auth0.jwt.JWTVerifier;importcom.auth0.jwt.algorithms.Algorithm;importcom.auth0.jwt.exceptions.JWTDecodeException;importcom.auth0.jwt.exceptions.JWTVerificationException;importcom.my_springboot.rbac.pojo.Admin;importcom.my_springboot.rbac.service.IAdminService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.method.HandlerMethod;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.lang.reflect.Method;/*** 拦截器去获取token并验证token*/

public class AuthenticationInterceptor implementsHandlerInterceptor {

@AutowiredprivateIAdminService adminService;

@Overridepublic booleanpreHandle(HttpServletRequest httpServletRequest,

HttpServletResponse httpServletResponse, Object object) {

String token= httpServletRequest.getHeader ("token");//从 http 请求头中取出 token//如果不是映射到方法直接通过

if (!(object instanceofHandlerMethod)) {return true;

}

HandlerMethod handlerMethod=(HandlerMethod) object;

Method method=handlerMethod.getMethod ();//检查是否有@passtoken注解,有则跳过认证

if (method.isAnnotationPresent (PassToken.class)) {

PassToken passToken= method.getAnnotation (PassToken.class);if(passToken.required ()) {return true;

}

}//检查有没有需要用户权限的注解

if (method.isAnnotationPresent (UserLoginToken.class)) {

UserLoginToken userLoginToken= method.getAnnotation (UserLoginToken.class);if(userLoginToken.required ()) {//执行认证

if (token == null) {throw new RuntimeException ("无token");

}//获取 token 中的 user id

String adminId;try{

adminId= JWT.decode (token).getAudience ().get (0);

}catch(JWTDecodeException j) {throw new RuntimeException ("401");

}

Admin admin=adminService.getById (adminId);if (admin == null) {throw new RuntimeException ("用户不存在");

}//验证 token

JWTVerifier jwtVerifier =JWT.require (Algorithm.HMAC256 (admin.getPassword ())).build ();try{

jwtVerifier.verify (token);

}catch(JWTVerificationException e) {throw new RuntimeException ("401");

}return true;

}

}return true;

}

@Overridepublic voidpostHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView)throwsException { }

@Overridepublic voidafterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e)throwsException { }

}

转载地址:http://ajima.baihongyu.com/

你可能感兴趣的文章
大型网站技术架构(四)网站的高性能架构
查看>>
BAT资深架构师告诉你从程序员到架构师,你需要掌握什么能力?
查看>>
电脑被格式化了如何恢复?
查看>>
母亲像一道明亮的光
查看>>
js判断数组中是否包含某元素
查看>>
关于tcp/ip三次握手的理解和详细分析
查看>>
高性能web开发之网络传输环节
查看>>
遍历Map的四种方法
查看>>
https、SSL与数字证书介绍
查看>>
【VMCloud云平台】SCVMM配置(二)创建一片云
查看>>
http://bbs.linuxtone.org/thread-15681-1-1.html
查看>>
TIBCO add user error solution
查看>>
ssh服务的安装与运行
查看>>
linux-centos7搭建本地yum服务并使用
查看>>
For input string: "null"
查看>>
『高级篇』docker之微服务业务分析(九)
查看>>
安装、登录CentOS7
查看>>
selenium处理嵌套iframe
查看>>
通过思科模拟器CISCO PACKET TRACER学习网络3——初步认识VLAN
查看>>
我的友情链接
查看>>