文末有本篇文章的项目源码文件可供下载学习
在这个案例中,我们已经实现了自定义登录URI的操作,登录成功之后,我们再次访问后端中的API的时候要在请求头中携带token,此时的token是jwt字符串,我们需要将该jwt字符串进行解析,查看解析后的User对象是否处于登录状态.登录状态下,将用户信息封装成Authentication对象用于后续过滤器验证,并放行,未登录状态下直接拒绝访问.
0.配置思路
- 在本案例基础上,进行升级.
- 新建JwtAuthenticateFilter.java,实现认证过滤器.
- 配置SecurityConfig.java,将JwtAuthenticateFilter加入过滤器链.
- 进行相关测试.
1.新建JwtAuthenticateFilter.java
@Component
public class JwtAuthenticateFilter extends OncePerRequestFilter {@Autowiredprivate UserMapper userMapper;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// 1.获取tokenString token = request.getHeader("token");if (!StringUtils.hasText(token)) {filterChain.doFilter(request, response);return;}
// 2.解析tokenClaims claims = JwtUtil.parseJWT(token);String userId = claims.getId(); //获取用户IdString userDetailsString = claims.getSubject();UserDetailsImpl userDetails = JSON.parseObject(userDetailsString, UserDetailsImpl.class);
// 3.获取用户信息User user = userMapper.findById(userId);if (Objects.isNull(user) || user.getCurrentFlag().equals("logout")) {throw new RuntimeException("用户未登录");}
// 4.存入SecurityContextHolder//获取权限信息封装到authenticationToken对象中UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails,null,null);SecurityContextHolder.getContext().setAuthentication(authenticationToken);
// 5.放行filterChain.doFilter(request, response);}
}
2.配置SecurityConfig.java
@Overrideprotected void configure(HttpSecurity http) throws Exception {http
// 关闭csrf.csrf().disable()
// 不通过session获取SecurityContext.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()
// 放行登录接口,允许匿名访问.antMatchers("/security/login").anonymous()
// 登录不登录的都可以访问,放行
// .antMatchers("/hello").permitAll()
// 除上面外的所有请求全部需要认证授权.anyRequest().authenticated();// 配置认证jwt过滤器http.addFilterBefore(jwtAuthenticateFilter, UsernamePasswordAuthenticationFilter.class);}
3.相关测试
3.1未登录测试
我们发现返回403状态码,被拒绝访问.
3.2登录之后访问测试
我们发现返回了token值,将token值复制下来,放到自定义访问的请求头中,之后进行访问测试.
我们发现就能正常访问了.
本篇文章的项目源码文件,可点击下载学习