luofl
2025-02-23 0facef68a06fb36cc1ac12730b076cead36348f9
springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java
@@ -9,7 +9,9 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.panzhihua.common.model.vos.sangeshenbian.SystemUserVo;
import com.panzhihua.common.model.vos.user.SysAppConfigVO;
import com.panzhihua.common.service.sangeshenbian.SystemUserService;
import com.panzhihua.common.utlis.*;
import org.springframework.context.ApplicationContext;
import org.springframework.data.redis.core.StringRedisTemplate;
@@ -40,6 +42,7 @@
public class JWTAuthenticationTokenFilter implements Filter {
    private StringRedisTemplate stringRedisTemplate;
    private UserService userService;
    private SystemUserService systemUserService;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
@@ -65,6 +68,7 @@
        stringRedisTemplate = ctx.getBean(StringRedisTemplate.class);
        ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
        userService = ctx.getBean(UserService.class);
        systemUserService = ctx.getBean(SystemUserService.class);
        String requestURI = request.getRequestURI();
        boolean login = requestURI.contains("login");
        boolean union = requestURI.contains("huacheng-union-applets");
@@ -187,6 +191,47 @@
                        }
                        valueOperations.set(roleAppletKey, JSONArray.toJSONString(authorities), 24, TimeUnit.HOURS);
                    }
                } else if(21 == type){
                    //三个身边
                    String key = SecurityConstants.ROLE_USER + "sangeshenbian:" + userId;
                    Boolean aBoolean = stringRedisTemplate.hasKey(key);
                    R<SystemUserVo> r = systemUserService.getUserById(userId);
                    if (aBoolean) {
                        String roles = valueOperations.get(key);
                        authorities = JSONArray.parseArray(roles, SimpleGrantedAuthority.class);
                    } else {
                        SystemUserVo data = r.getData();
                        if (!ObjectUtils.isEmpty(data)) {
                            authorities.add(new SimpleGrantedAuthority(data.getSystemRoleId().toString()));
                            valueOperations.set(key, JSONArray.toJSONString(authorities), 24, TimeUnit.HOURS);
                        }
                    }
                    UsernamePasswordAuthenticationToken authentication =
                            new UsernamePasswordAuthenticationToken(userId, userId, authorities);// 主要使用权限 账户 密码 不重要
                    SecurityContextHolder.getContext().setAuthentication(authentication);
                    safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_LOGOUT, tokenHeader);
                    // 登录用户的所有信息
                    String userKey = UserConstants.LOGIN_USER_INFO + "sangeshenbian:" + userId;
                    Boolean hasKeyLoginUserInfo = stringRedisTemplate.hasKey(userKey);
                    if (hasKeyLoginUserInfo) {
                        String userInfo = valueOperations.get(userKey);
                        byte[] encrypt = AES.encrypt(userInfo, Constants.AES_KEY);
                        String hexStr = AES.parseByte2HexStr(encrypt);
                        safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_USERINFO, hexStr);
                    } else {
                        if (!R.isOk(r)) {
                            ResultUtil.responseJson(response, R.fail(HttpStatus.ERROR, "登录用户信息查询失败"));
                            return;
                        }
                        SystemUserVo data = r.getData();
                        String userInfo = JSONObject.toJSONString(data);
                        valueOperations.set(userKey, userInfo, 24, TimeUnit.HOURS);
                        byte[] encrypt = AES.encrypt(userInfo, Constants.AES_KEY);
                        String hexStr = AES.parseByte2HexStr(encrypt);
                        safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_USERINFO, hexStr);
                    }
                } else {
                    String key = SecurityConstants.ROLE_USER + userId;
                    Boolean aBoolean = stringRedisTemplate.hasKey(key);
@@ -204,32 +249,34 @@
                            valueOperations.set(key, JSONArray.toJSONString(authorities), 24, TimeUnit.HOURS);
                        }
                    }
                }
                UsernamePasswordAuthenticationToken authentication =
                        new UsernamePasswordAuthenticationToken(userId, userId, authorities);// 主要使用权限 账户 密码 不重要
                SecurityContextHolder.getContext().setAuthentication(authentication);
                safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_LOGOUT, tokenHeader);
                // 登录用户的所有信息
                String userKey = UserConstants.LOGIN_USER_INFO + userId;
                Boolean hasKeyLoginUserInfo = stringRedisTemplate.hasKey(userKey);
                if (hasKeyLoginUserInfo) {
                    String userInfo = valueOperations.get(userKey);
                    byte[] encrypt = AES.encrypt(userInfo, Constants.AES_KEY);
                    String hexStr = AES.parseByte2HexStr(encrypt);
                    safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_USERINFO, hexStr);
                } else {
                    R<LoginUserInfoVO> r = userService.getUserInfoByUserId(userId);
                    if (!R.isOk(r)) {
                        ResultUtil.responseJson(response, R.fail(HttpStatus.ERROR, "登录用户信息查询失败"));
                        return;
                    UsernamePasswordAuthenticationToken authentication =
                            new UsernamePasswordAuthenticationToken(userId, userId, authorities);// 主要使用权限 账户 密码 不重要
                    SecurityContextHolder.getContext().setAuthentication(authentication);
                    safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_LOGOUT, tokenHeader);
                    // 登录用户的所有信息
                    String userKey = UserConstants.LOGIN_USER_INFO + userId;
                    Boolean hasKeyLoginUserInfo = stringRedisTemplate.hasKey(userKey);
                    if (hasKeyLoginUserInfo) {
                        String userInfo = valueOperations.get(userKey);
                        byte[] encrypt = AES.encrypt(userInfo, Constants.AES_KEY);
                        String hexStr = AES.parseByte2HexStr(encrypt);
                        safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_USERINFO, hexStr);
                    } else {
                        R<LoginUserInfoVO> r = userService.getUserInfoByUserId(userId);
                        if (!R.isOk(r)) {
                            ResultUtil.responseJson(response, R.fail(HttpStatus.ERROR, "登录用户信息查询失败"));
                            return;
                        }
                        LoginUserInfoVO data = r.getData();
                        String userInfo = JSONObject.toJSONString(data);
                        valueOperations.set(userKey, userInfo, 24, TimeUnit.HOURS);
                        byte[] encrypt = AES.encrypt(userInfo, Constants.AES_KEY);
                        String hexStr = AES.parseByte2HexStr(encrypt);
                        safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_USERINFO, hexStr);
                    }
                    LoginUserInfoVO data = r.getData();
                    String userInfo = JSONObject.toJSONString(data);
                    valueOperations.set(userKey, userInfo, 24, TimeUnit.HOURS);
                    byte[] encrypt = AES.encrypt(userInfo, Constants.AES_KEY);
                    String hexStr = AES.parseByte2HexStr(encrypt);
                    safeboxRequestWrapper.addHeader(TokenConstant.TOKEN_USERINFO, hexStr);
                }
            } else {
                // 小程序无需登录也可访问地址列表
                List<String> noLoginUrl = new ArrayList<>();