文末有本篇文章的項目源碼文件可供下載學習
在這個案例中,我們已經實現了自定義登錄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值復制下來,放到自定義訪問的請求頭中,之后進行訪問測試.
我們發現就能正常訪問了.
本篇文章的項目源碼文件,可點擊下載學習