作者 朱兆平

token认证方式改为从redis认证

1 package com.tianbo.warehouse.security.filter; 1 package com.tianbo.warehouse.security.filter;
2 2
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.alibaba.fastjson.JSONObject;
  5 +import com.tianbo.warehouse.model.USERS;
3 import com.tianbo.warehouse.security.CustomUserDetailService; 6 import com.tianbo.warehouse.security.CustomUserDetailService;
  7 +import com.tianbo.warehouse.util.RedisUtils;
  8 +import lombok.extern.slf4j.Slf4j;
4 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.beans.factory.annotation.Autowired;
5 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 10 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
6 import org.springframework.security.core.context.SecurityContextHolder; 11 import org.springframework.security.core.context.SecurityContextHolder;
  12 +import org.springframework.security.core.userdetails.User;
7 import org.springframework.security.core.userdetails.UserDetails; 13 import org.springframework.security.core.userdetails.UserDetails;
8 import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; 14 import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
9 import org.springframework.stereotype.Component; 15 import org.springframework.stereotype.Component;
@@ -23,10 +29,14 @@ import java.io.IOException; @@ -23,10 +29,14 @@ import java.io.IOException;
23 * 注意此过滤器每次都会被访问,每个URL带TOKEN 访问这里然后去查用户的资料 会造成数据库压力。 29 * 注意此过滤器每次都会被访问,每个URL带TOKEN 访问这里然后去查用户的资料 会造成数据库压力。
24 * !!!!后期要把用户资料存储在Redis中,然后用户资料从redis中取,减少数据库压力。 30 * !!!!后期要把用户资料存储在Redis中,然后用户资料从redis中取,减少数据库压力。
25 */ 31 */
  32 +@Slf4j
26 @Component 33 @Component
27 public class JwtAuthenticationTokenFilter extends OncePerRequestFilter{ 34 public class JwtAuthenticationTokenFilter extends OncePerRequestFilter{
28 35
29 @Autowired 36 @Autowired
  37 + RedisUtils redisUtils;
  38 +
  39 + @Autowired
30 CustomUserDetailService userDetailService; 40 CustomUserDetailService userDetailService;
31 41
32 @Override 42 @Override
@@ -38,23 +48,38 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter{ @@ -38,23 +48,38 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter{
38 //请求体为 Bearer token 48 //请求体为 Bearer token
39 String authHeader = request.getHeader("Authorization"); 49 String authHeader = request.getHeader("Authorization");
40 if (authHeader != null && authHeader.startsWith("Bearer ")) { 50 if (authHeader != null && authHeader.startsWith("Bearer ")) {
  51 + //获取具体token值,不用了
41 final String authToken = authHeader.substring("Bearer ".length()); 52 final String authToken = authHeader.substring("Bearer ".length());
42 53
43 - String username = JwtTokenUtil.parseToken(authToken);  
44 54
45 - //有JWT 没有登录,去JWT的 信息 获取用户信息,赋予登录  
46 - if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {  
47 - UserDetails userDetails = userDetailService.loadUserByUsername(username);  
48 - if (userDetails != null) { 55 +// String username = JwtTokenUtil.parseToken(authToken);
  56 + String userJson = redisUtils.get(authToken);
  57 + try {
  58 + if (userJson!=null){
  59 + USERS u = JSON.parseObject(userJson,USERS.class);
  60 + String username = u.getUsername();
  61 + //有JWT 没有登录,去JWT的 信息 获取用户信息,赋予登录
  62 + if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
  63 + UserDetails userDetails = userDetailService.loadUserByUsername(username);
  64 + if (userDetails != null) {
49 65
50 - UsernamePasswordAuthenticationToken authentication =  
51 - new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());  
52 - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));  
53 - SecurityContextHolder.getContext().setAuthentication(authentication); 66 + UsernamePasswordAuthenticationToken authentication =
  67 + new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
  68 + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
  69 + SecurityContextHolder.getContext().setAuthentication(authentication);
  70 + }
  71 + }
54 } 72 }
  73 +
  74 + }catch (Exception e){
  75 + e.printStackTrace();
  76 + log.error(e.toString());
55 } 77 }
56 78
  79 + }else{
  80 + log.warn("token验证未通过{}",authHeader);
57 } 81 }
  82 +
58 filterChain.doFilter(request, response); 83 filterChain.doFilter(request, response);
59 } 84 }
60 } 85 }