public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Autowired
private RedisCache redisCache;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//获取token
String token = request.getHeader("token");
if(!StringUtils.hasText(token)){
//放行 继承类 OncePerRequestFilter 的方法 doFilterInternal 放行方法如下
filterChain.doFilter(request,response);
//一定要记住有个return 不然上面方法如果返回后到此依然执行到下面的全部代码了
return;
}
//解析token
String userid;
try{
Claims claims = JwtUtil.parseJWT(token);
userid = claims.getSubject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("token非法");
}
//从redis中获取用户信息
String redisKey = "login" + userid;
LoginUser loginUser = redisCache.getCacheObject(redisKey);
if(Objects.isNull(loginUser)){
throw new RuntimeException("用户未登录");
}
//todo 获取权限信息封装到Authentication中
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser,null,null);
//存入到SecurityContextHolder 接受参数 AuthenticationToken 对象,所有上一步要封装一个AuthenticationToken对象,参数分别是数据 身份 权限
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
filterChain.doFilter(request,response);
}
}```
token认证过滤器实现(配合redis)
最新推荐文章于 2024-12-26 21:48:59 发布
该代码实现了一个基于JWT的认证过滤器,通过检查请求头中的token来验证用户。如果token不存在或非法,将抛出异常。合法的token会被解析,从Redis缓存中获取用户信息,并创建AuthenticationToken存储在SecurityContextHolder中,以进行权限控制。
827

被折叠的 条评论
为什么被折叠?



