Spring Security之前后端分离(二)JWT令牌
传送门:
- 有关于Spring Security 基础配置:https://blog.csdn.net/MostSnails/article/details/126312877
- 基础配置默认官方使用Session方式,分布式服务请求是无状态故Session有点满足要求。本期实践JWT以Token方式请求认证。
- 什么是JWT、采用哪些部分组成?这里就不多叙述,自行百度。
如何配置
配置Token拦截器,在UsernamePasswordAuthenticationFilter过滤器前先执行Token拦截器,UsernamePasswordAuthenticationFilter在基础配置中有讲过。
JWT生成器、解析器、Login请求下发Token
Security配置主要关闭Session、添加Token拦截器入配置
配置Token拦截器
需要实现OncePerRequestFilter接口,拦截所有请求,检测Header中Authorization属性、验证属性(过期、非法)、放行进入UsernamePasswordAuthenticationFilter
没有Authorization属性,直接放行,进入下一个过滤器属于Security,Security会去验证当前URL是否可匿名访问或需要权限访问。
/**
* Token过滤器
* desc:验证请求Token合法性
*/
@Component
public class TokenPerRequestFilter extends OncePerRequestFilter {
@Autowired
private UserService userService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// 获取Authorization属性
String token = request.getHeader("Authorization");
if (StringUtils.isNotEmpty(token)) {
//解析Token获取载荷
try {
Claims claims = JwtUtil.parseJWT(token);
//获取用户信息 在创建Token Subject是传入json 这里可以获取你json值 Subject是可以任何,怎么set 就怎么get
String userName = claims.getSubject();
UserDetails userDetails = userService.loadUser(userName);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
//放入上下文
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
} catch (ExpiredJwtException exception) {