zhibing.pu
2024-08-23 74f339a1f6f8c225d2cf04b8ba15b5e6654a8efd
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
@@ -1,17 +1,13 @@
package com.ruoyi.gateway.filter;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
@@ -27,7 +23,6 @@
import io.jsonwebtoken.Claims;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@@ -48,14 +43,6 @@
   @Autowired
   private RedisService redisService;
   
   @Lazy
   @Resource
   private AppUserClient appUserClient;
   @Lazy
   @Resource
   private SysUserClient sysUserClient;
   
   
   @Override
@@ -69,20 +56,19 @@
         return chain.filter(exchange);
      }
      //防抖校验
//      try {
//         antiShake(request);
//      }catch (Exception e){
//         log.error("[重复提交]请求路径:{}", exchange.getRequest().getPath());
//         return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage(), HttpStatus.SUCCESS);
//      }
      try {
         antiShake(request);
      }catch (Exception e){
         log.error("[重复提交]请求路径:{}", exchange.getRequest().getPath());
         return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage(), HttpStatus.SUCCESS);
      }
      
      //校验账户是否有效
//      try {
//         verifyToken(request);
//         verifyAccount(request);
//      }catch (Exception e){
//         return unauthorizedResponse(exchange, e.getMessage());
//      }
      try {
         verifyToken(request);
      }catch (Exception e){
         return unauthorizedResponse(exchange, e.getMessage());
      }
      String token = getToken(request);
      Claims claims = JwtUtils.parseToken(token);
      String userkey = JwtUtils.getUserKey(claims);
@@ -140,9 +126,19 @@
    * 防抖处理
    */
   public void antiShake(ServerHttpRequest request) throws Exception{
      HttpMethod method = request.getMethod();
      if(HttpMethod.OPTIONS == method){
         return;
      }
      HttpHeaders headers = request.getHeaders();
      String client = headers.getFirst("client");
      String timestamp = headers.getFirst("timestamp");
      if(StringUtils.isEmpty(client)){
         throw new RuntimeException("参数异常");
      }
      if(StringUtils.isEmpty(timestamp)){
         throw new RuntimeException("参数异常");
      }
      String url = request.getURI().getPath();
      Map<String, Object> cacheMap = redisService.getCacheMap(client);
      if(null == cacheMap){
@@ -183,47 +179,15 @@
      if (claims == null) {
         throw new RuntimeException("令牌已过期或验证不正确!");
      }
      String userkey = JwtUtils.getUserKey(claims);
      boolean islogin = redisService.hasKey(getTokenKey(userkey));
      if (!islogin) {
         throw new RuntimeException("登录状态已过期");
      }
//      String userkey = JwtUtils.getUserKey(claims);
//      boolean islogin = redisService.hasKey(getTokenKey(userkey));
//      if (!islogin) {
//         throw new RuntimeException("登录状态已过期");
//      }
      String userid = JwtUtils.getUserId(claims);
      String username = JwtUtils.getUserName(claims);
      if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)) {
         throw new RuntimeException("令牌验证失败");
      }
   }
   /**
    * 校验账户是否有效
    * @param request
    * @throws Exception
    */
   public void verifyAccount(ServerHttpRequest request) throws Exception{
      String token = getToken(request);
      Claims claims = JwtUtils.parseToken(token);
      String userid = JwtUtils.getUserId(claims);
      String userType = JwtUtils.getUserType(claims);
      //管理后台用户
      if ("system".equals(userType)) {
         SysUser sysUser = sysUserClient.getSysUser(Long.valueOf(userid)).getData();
         if(null == sysUser || "2".equals(sysUser.getDelFlag())){
            throw new RuntimeException("无效的账户");
         }
         if("1".equals(sysUser.getStatus())){
            throw new RuntimeException("账户已被停用,请联系系统管理员!");
         }
      }
      //小程序用户
      if ("applet".equals(userType)) {
         TAppUser appUser = appUserClient.getUserById(Long.valueOf(userid)).getData();
         if(null == appUser || appUser.getDelFlag() || 3 == appUser.getStatus()){
            throw new RuntimeException("无效的账户");
         }
         if(2 == appUser.getStatus()){
            throw new RuntimeException("账户已被冻结,请联系系统管理员!");
         }
      }
   }