博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot 使用jwt进行身份验证
阅读量:6373 次
发布时间:2019-06-23

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

这里只供参考,比较使用jwt方式进行身份验证感觉不好,最不行的就是不能退出

登陆时设定多长过期时间,只能等这个时间过了以后才算退出,服务端只能验证请求过来的token是否通过验证

Code:

/** * Created by qhong on 2018/6/7 15:34 * 标注该注解的,就不需要登录 **/@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface AuthIgnore {}

LoginUser:

@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)public @interface LoginUser {}

JwtUtil:

@ConfigurationProperties(prefix = "jwt")@Componentpublic class JwtUtils {    private Logger logger = LoggerFactory.getLogger(getClass());    private String secret;    private long expire;    private String header;    /**     * 生成jwt token     */    public String generateToken(long userId) {        Date nowDate = new Date();        //过期时间        Date expireDate = new Date(nowDate.getTime() + expire * 1000);        return Jwts.builder()                .setHeaderParam("typ", "JWT")                .setSubject(userId+"")                .setIssuedAt(nowDate)                .setExpiration(expireDate)                .signWith(io.jsonwebtoken.SignatureAlgorithm.HS512, secret)                .compact();    }    public Claims getClaimByToken(String token) {        try {            return Jwts.parser()                    .setSigningKey(secret)                    .parseClaimsJws(token)                    .getBody();        }catch (Exception e){            logger.debug("validate is token error ", e);            return null;        }    }    /**     * token是否过期     * @return  true:过期     */    public boolean isTokenExpired(Date expiration) {        return expiration.before(new Date());    }    public String getSecret() {        return secret;    }    public void setSecret(String secret) {        this.secret = secret;    }    public long getExpire() {        return expire;    }    public void setExpire(long expire) {        this.expire = expire;    }    public String getHeader() {        return header;    }    public void setHeader(String header) {        this.header = header;    }}

application.properties配置:

# 加密秘钥jwt.secret=f4e2e52034348f86b67cde581c0f9eb5# token有效时长,单位秒jwt.expire=60000jwt.header=token

拦截器:

/** * Created by qhong on 2018/6/7 15:36 **/@Componentpublic class AuthorizationInterceptor extends HandlerInterceptorAdapter {    @Autowired    private JwtUtils jwtUtils;    public static final String USER_KEY = "userId";    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        AuthIgnore annotation;        if(handler instanceof HandlerMethod) {            annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthIgnore.class);        }else{            return true;        }        //如果有@AuthIgnore注解,则不验证token        if(annotation != null){            return true;        }        //获取用户凭证        String token = request.getHeader(jwtUtils.getHeader());        if(StringUtils.isBlank(token)){            token = request.getParameter(jwtUtils.getHeader());        }        //token凭证为空        if(StringUtils.isBlank(token)){            throw new AuthException(jwtUtils.getHeader() + "不能为空", HttpStatus.UNAUTHORIZED.value());        }        Claims claims = jwtUtils.getClaimByToken(token);        if(claims == null || jwtUtils.isTokenExpired(claims.getExpiration())){            throw new AuthException(jwtUtils.getHeader() + "失效,请重新登录", HttpStatus.UNAUTHORIZED.value());        }        //设置userId到request里,后续根据userId,获取用户信息        request.setAttribute(USER_KEY, Long.parseLong(claims.getSubject()));        return true;    }}

注解拦截:

@Componentpublic class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {    @Autowired    private UserService userService;    @Override    public boolean supportsParameter(MethodParameter parameter) {        return parameter.getParameterType().isAssignableFrom(User.class) && parameter.hasParameterAnnotation(LoginUser.class);    }    @Override    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,                                  NativeWebRequest request, WebDataBinderFactory factory) throws Exception {        //获取用户ID        Object object = request.getAttribute(AuthorizationInterceptor.USER_KEY, RequestAttributes.SCOPE_REQUEST);        if(object == null){            return null;        }        //获取用户信息        User user = userService.selectById((Long)object);        return user;    }}

WebConfig:

@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter {    @Autowired    private AuthorizationInterceptor authorizationInterceptor;    @Autowired    private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver;    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(authorizationInterceptor).addPathPatterns("/**");    }    @Override    public void addArgumentResolvers(List
argumentResolvers) { argumentResolvers.add(loginUserHandlerMethodArgumentResolver); }}

Login:

@PostMapping("/login")    @AuthIgnore    public R login2(@RequestBody User u){        //用户登录        long userId =userService.addUser(u);        //生成token        String token = jwtUtils.generateToken(userId);        Map
map = new HashMap<>(); map.put("token", token); map.put("expire", jwtUtils.getExpire()); return R.ok(map); }

LoginUser注解使用:

@RequestMapping(value="/query2",method= RequestMethod.POST)    public User Query2(@LoginUser User u){         return u;    }

 

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

你可能感兴趣的文章
Python PyCharm编辑器配置和使用
查看>>
Python单例模式(Singleton)的N种实现
查看>>
requirejs的插件介绍与制作
查看>>
SpringBoot整合Angular应用第二弹-配置支持Angular
查看>>
Facebook、纽约大学利用机器学习5分钟搞定核磁共振检查
查看>>
221. Maximal Square
查看>>
MySQL基础
查看>>
机器学习A-Z~支持向量机
查看>>
PAT A1010 二分进制结合重点题
查看>>
LeetCode35.搜索插入位置 JavaScript
查看>>
数据结构java版之大O表示法
查看>>
DOM事件全面总结
查看>>
CSS3径向渐变radial-gradient实现波浪边框和内倒角
查看>>
5个让人赞不绝口的微信小程序,拒绝占用手机内存!
查看>>
Spring Security整合KeyCloak保护Rest API
查看>>
【Leetcode】98. 验证二叉搜索树
查看>>
POS概述
查看>>
containerd发布了CRI修复程序和CVE-2019-5736更新的runc
查看>>
77. Combinations
查看>>
WEB前端开发的思考与感悟
查看>>