JWT token验证后,通过 ThreadLocal 进行传值
Spring Boot JWT 用户认证
JWT token验证后,通过 ThreadLocal 进行传值,在服务层直接使用 Threadlocal 获取当前用户,的Id、姓名,进行行为记录
定义一个用户实体类
package com.vipsoft.core.user.entity; import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serializable;
import java.util.Date; public class TokenEntity implements Serializable { private String userId; private String userName; private String accessToken; private String refreshToken; private int expiry; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.sssZ", timezone = "GMT+8")
private Date expiryDate; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.sssZ", timezone = "GMT+8")
private Date createTime; public String getUserId() {
return userId;
} public void setUserId(String userId) {
this.userId = userId;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getAccessToken() {
return accessToken;
} public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
} public String getRefreshToken() {
return refreshToken;
} public void setRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
} public int getExpiry() {
return expiry;
} public void setExpiry(int expiry) {
this.expiry = expiry;
} public Date getExpiryDate() {
return expiryDate;
} public void setExpiryDate(Date expiryDate) {
this.expiryDate = expiryDate;
} public Date getCreateTime() {
return createTime;
} public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
SessionBase
package com.vipsoft.core.user.entity;
public class SessionBase {
/**
* 用来存放登录用户的信息
*/
public static final ThreadLocal<TokenEntity> CURRENT_MEMBER = new ThreadLocal();
}
AuthorizationInterceptor
package com.vipsoft.web.boot.interceptor; import cn.hutool.core.util.StrUtil;
import com.vipsoft.core.user.entity.SessionBase;
import com.vipsoft.core.user.entity.TokenEntity;
import com.vipsoft.web.boot.annotation.JwtIgnore;
import com.vipsoft.web.boot.exception.CustomException;
import com.vipsoft.web.boot.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @Component
public class AuthorizationInterceptor extends HandlerInterceptorAdapter {
private Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
private JwtUtils jwtUtils; public static final String USER_KEY = "userId"; @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//
// 忽略带JwtIgnore注解的请求, 不做后续token认证校验
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
JwtIgnore jwtIgnore = handlerMethod.getMethodAnnotation(JwtIgnore.class);
if (jwtIgnore != null) {
return true;
}
} if (HttpMethod.OPTIONS.equals(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
return true;
} //获取用户凭证
String token = request.getHeader(jwtUtils.getHeader());
if (StrUtil.isBlank(token)) {
token = request.getParameter(jwtUtils.getHeader());
} //凭证为空
if (StrUtil.isBlank(token)) {
throw new CustomException(HttpStatus.UNAUTHORIZED.value(), "token 不能为空");
} Claims claims = jwtUtils.getClaimByToken(token);
if (claims == null || jwtUtils.isTokenExpired(claims.getExpiration())) {
throw new CustomException(HttpStatus.UNAUTHORIZED.value(), "token 失效,请重新登录");
} String[] userinfo = claims.getSubject().split("\\|");
//判断redis是否存在这个key
// String redisKey = StrUtil.indexedFormat("TOKEN_USER", userinfo[0]);
// String redisValue = redisTemplate.opsForValue().get(redisKey);
// if (!token.equals(redisValue)) {
// throw new CustomException(HttpStatus.UNAUTHORIZED.value(), "token 失效,请重新登录");
// } //新增ThreadLocal返回用户信息的方式
TokenEntity tokenEntity = new TokenEntity();
tokenEntity.setUserId(userinfo[0]);
tokenEntity.setUserName(userinfo[1]);
tokenEntity.setAccessToken(token);
SessionBase.CURRENT_MEMBER.set(tokenEntity); //也可以通过 Request 数据传送,设置userId到request里,后续根据userId,获取用户信息
request.setAttribute(USER_KEY, userinfo[0]);
return true;
}
}
调用
@Override
public void insert(Users user) {
TokenEntity tokenEntity = SessionBase.CURRENT_MEMBER.get();
String userId = tokenEntity != null ? tokenEntity.getUserId() : "";
String userName = tokenEntity != null ? tokenEntity.getUserName() : "";
user.setCreateUserId(userId);
user.setCreateUserName(userName);
userMapper.insert(user);
}
JWT token验证后,通过 ThreadLocal 进行传值的更多相关文章
- 微信订阅号开发之token验证后,自动回复消息功能做好,发送消息没有返回
相信很多人会跟我一样,token验证之后,发送消息给订阅号,没有消息返回. 以下,说一下我辛苦调试得到的解决办法: 首先,token验证: 自己写的token一直验证失败,找了好久,没有发现bug.实 ...
- koa2+redis+jwt token验证,简单注册登录
首先新建文件夹命名koa-server,npm init,相关包的安装就不说了,这是我的package.json 新建index.js文件,编码如下,config全局配置不用管,redis是一个简单的 ...
- jwt Token验证与解析
网上似乎没有相关代码 贴上一段Token的解析认证 [TestMethod] public void TestMethod1() { string Token = "eyJhbGciOiJI ...
- 【JWT】JWT+HA256加密 Token验证
目录 Token验证 传统的Token验证 JWT+HA256验证 回到顶部 Token验证 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twi ...
- Spring Cloud OAuth2.0 微服务中配置 Jwt Token 签名/验证
关于 Jwt Token 的签名与安全性前面已经做了几篇介绍,在 IdentityServer4 中定义了 Jwt Token 与 Reference Token 两种验证方式(https://www ...
- 基于jwt的token验证
一.什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该token被设计为紧凑且安全的,特别适用于分布 ...
- webapi中使用token验证(JWT验证)
本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get(" ...
- Asp.Net Core 3.1 学习3、Web Api 中基于JWT的token验证及Swagger使用
1.初始JWT 1.1.JWT原理 JWT(JSON Web Token)是目前最流行的跨域身份验证解决方案,他的优势就在于服务器不用存token便于分布式开发,给APP提供数据用于前后端分离的项目. ...
- 【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
问题描述 使用微软Azure AD,对授权进行管理.通过所注册应用的OAuth API(https://login.chinacloudapi.cn/{TENANT ID}/oauth2/v2.0/t ...
- Django restframework之Token验证的缺陷及jwt的简单使用
一.主要缺陷: 1.Token验证是放在一张表中,即authtoken_token中,key没有失效时间,永久有效,一旦泄露,后果不可想象,安全性极差. 2.不利于分布式部署或多个系统使用一套验证,a ...
随机推荐
- 高精度加法(C语言实现)
高精度加法(C语言实现) 介绍 众所周知,整数在C和C++中以int ,long,long long三种不同大小的数据存储,数据大小最大可达2^64,但是在实际使用中,我们仍不可避免的会遇到爆long ...
- AtCoder Beginner Contest 326 (ABC326)
A. 2UP3DOWN 直接模拟即可. Code B. 326-like Numbers 枚举,每次拆除百.十.个位,再判断. Code C. Peak Description 数字线上放置了 \(N ...
- pygame播放视频并实现音视频同步
一.前言 在我接触pygame时最新的pygame已经不支持movie模块,这就导致在pygame播放视频变成一个问题,网上搜了下解决方案有两个: 一是使用opencv播放视频,再结合pygame.m ...
- MongoDB 中的事务
MongoDB 事务 前言 如何使用 事务的原理 事务和复复制集以及存储引擎之间的关系 WiredTiger 中的事务隔离级别 WiredTiger 事务过程 事务开启 事务执行 事务提交 事务回滚 ...
- C#/.NET/.NET Core推荐学习书籍(已分类)
前言 古人云:"书中自有黄金屋,书中自有颜如玉",说明了书籍的重要性.作为程序员,我们需要不断学习以提升自己的核心竞争力.以下是一些优秀的C#/.NET/.NET Core相关学习 ...
- 使用Tensorrt部署,C++ API yolov7_pose模型
使用Tensorrt部署,C++ API yolov7_pose模型 虽然标题叫部署yolov7_pose模型,但是接下来的教程可以使用Tensorrt部署任何pytorch模型. 仓库地址:http ...
- 跨境 ERP 积加系统与金蝶云星空系统数据集成对接方案
方案简介 由于积加ERP 系统专注服务于亚马逊跨境电商是非常复杂和庞大的应用系统,具有非常丰富的业务流程.复杂的系统架构和服务接口.主要涉及系统解决店铺运营,店铺管理,供应链管理,协同智能补货.采用& ...
- 有哪些可部署的, 无需编程的,基于WEB的数据可视化工具
基于Web的数据可视化工具在当今数字化时代具有重要的作用,可以帮助企业和个人更好地理解和利用数据.以下是一些无需编程即可部署的基于Web的数据可视化工具,详细描述如下:Tableau Public: ...
- Head First Java学习:第八章-接口和抽象类
第八章:接口和抽象类 深入多态 1.抽象类:有些类不应该被初始化 在类声明前面加上抽象类的关键字,abstract. 防止类被初始化,即不能被"new"创建该类的实例(要求) 还是 ...
- 解决/usr/bin/pip: No such file or directory
问题描述: 因为home的空间不足,所以我将anaconda3文件夹移动到了别的位置上了,导致我在命令行中输入python的命令时,显示的是python2.7(也就是linux自带的),后面我又为an ...