若依RuoYi-Vue代码学习一---若依如何基于OncePerRequestFilter【Spring Security的过滤器】验证的token与用户信息
文章目录一、通过token获取用户信息二、验证token过期一、通过token获取用户信息代码位置:com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter直接上代码:/*** token过滤器 验证token有效性* 每个请求过滤器一次OncePerRequestFilter* @author ruoyi*/@Compone
·
一、通过token获取用户信息
代码位置:
com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter
直接上代码:
/**
* token过滤器 验证token有效性
* 每个请求过滤器一次OncePerRequestFilter
* @author ruoyi
*/
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
{
@Autowired
private TokenService tokenService;
//做内部过滤
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException
{
LoginUser loginUser = tokenService.getLoginUser(request);
/**
* 判断用户存在 和 用户已登录(认证)
*/
if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
{
/**
* token是否过期,相差不足20分钟,自动刷新缓存
*/
tokenService.verifyToken(loginUser);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
//上下文设置新的认证
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
/**
* 导致调用链中的下一个过滤器,或者如果调用 过滤器是链中的最后一个过滤器,则导致调用链末尾的资源。
*/
chain.doFilter(request, response);
}
}
- 打上断点详细看看
- 先看看前端的请求头:
Authorization
就是token
了 - 断点方法
getLoginUser()
/**
* 获取用户身份信息
*
* @return 用户信息
*/
public LoginUser getLoginUser(HttpServletRequest request)
{
/**header:Authorization
* 获取请求携带的令牌====每次请求进行拦截,获取请求头中的token【getHeader】
* 获取到清空前缀的token值
*/
String token = getToken(request);
if (StringUtils.isNotEmpty(token))
{
try
{
//从令牌中获取数据声明====解析成对象
Claims claims = parseToken(token);
// 解析对应的权限以及用户信息
String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
String userKey = getTokenKey(uuid);//登录用户 redis key+uuid
LoginUser user = redisCache.getCacheObject(userKey);//获取缓存中的用户信息
return user;
}
catch (Exception e)
{
}
}
return null;
}
- 先看看获取请求头
header
- 清空
token前缀
----为什么清除呢?后面会用到剩下的内容进行解析,然后去查缓存 - 还是断点方法中,开始解析剩下的
token
- 进入解析令牌方法
- 解析结束后的
claims
- 合成用户缓存的key,然后从redis中查出这个用户的信息
二、验证token过期
- 验证过期
verifyToken
/**
* 验证令牌有效期,相差不足20分钟,自动刷新缓存
*
* @param loginUser
* @return 令牌
*/
public void verifyToken(LoginUser loginUser)
{
long expireTime = loginUser.getExpireTime();
long currentTime = System.currentTimeMillis();
if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
{
refreshToken(loginUser);
}
}
- 获取过期时间
expireTime
- 刷新令牌===重新设置缓存过期时间
- 可以看到过期时间发生了改变
剩下就是重新设置
spring security
的认证信息了,之前走过登录的,那些信息差别不大。
- 之后
spring security
剩下的过滤器链中帮我们更新头部信息 - 更新上下文信息
剩下也没什么了,遇到再说~~
w(゚Д゚)w
更多推荐
所有评论(0)