puzhibing
2024-08-23 62b7786dfe938a1353f43835cdd7dc239dc1e41b
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/filter/AuthFilter.java
@@ -1,117 +1,117 @@
//package com.ruoyi.other.filter;
//
//import com.alibaba.fastjson.JSON;
//import com.ruoyi.account.api.feignClient.AppUserClient;
//import com.ruoyi.account.api.model.TAppUser;
//import com.ruoyi.common.core.constant.TokenConstants;
//import com.ruoyi.common.core.domain.R;
//import com.ruoyi.common.core.utils.JwtUtils;
//import com.ruoyi.common.core.utils.StringUtils;
//import com.ruoyi.system.api.domain.SysUser;
//import com.ruoyi.system.api.feignClient.SysUserClient;
//import io.jsonwebtoken.Claims;
//import org.apache.logging.log4j.core.config.Order;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.context.annotation.Lazy;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.MediaType;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import javax.servlet.*;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//import java.io.PrintWriter;
//
///**
// * @author zhibing.pu
// * @Date 2024/8/23 11:22
// */
//@Order(-200)
//@Component
//public class AuthFilter implements Filter {
//   private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
//
//   @Lazy
//   @Resource
//   private AppUserClient appUserClient;
//
//   @Lazy
//   @Resource
//   private SysUserClient sysUserClient;
//
//
//   @Override
//   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//      HttpServletRequest request = (HttpServletRequest) servletRequest;
//      HttpServletResponse response = (HttpServletResponse) servletResponse;
//      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())){
//            log.error("[账户异常处理]请求账户id:{}", userid);
//            unauthorizedResponse(response,"无效的账户");
//            return;
//         }
//         if("1".equals(sysUser.getStatus())){
//            log.error("[账户异常处理]请求账户id:{}", userid);
//            unauthorizedResponse(response,"账户已被停用,请联系系统管理员!");
//            return;
//         }
//      }
//      //小程序用户
//      if ("applet".equals(userType)) {
//         TAppUser appUser = appUserClient.getUserById(Long.valueOf(userid)).getData();
//         if(null == appUser || appUser.getDelFlag() || 3 == appUser.getStatus()){
//            log.error("[账户异常处理]请求账户id:{}", userid);
//            unauthorizedResponse(response,"无效的账户");
//            return;
//         }
//         if(2 == appUser.getStatus()){
//            log.error("[账户异常处理]请求账户id:{}", userid);
//            unauthorizedResponse(response,"账户已被冻结,请联系系统管理员!");
//            return;
//         }
//      }
//      filterChain.doFilter(request, response);
//   }
//
//
//
//   private void unauthorizedResponse(HttpServletResponse response, String msg) {
//      response.setStatus(HttpStatus.OK.value());
//      response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE);
//      PrintWriter writer = null;
//      try {
//         writer = response.getWriter();
//      } catch (IOException e) {
//         throw new RuntimeException(e);
//      }
//      writer.println(JSON.toJSONString(R.fail(msg)));
//      writer.flush();
//      writer.close();
//   }
//
//
//
//   /**
//    * 获取请求token
//    */
//   private String getToken(HttpServletRequest request) {
//      String token = request.getHeader(TokenConstants.AUTHENTICATION);
//      // 如果前端设置了令牌前缀,则裁剪掉前缀
//      if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) {
//         token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
//      }
//      return token;
//   }
//
//
//}
package com.ruoyi.other.filter;
import com.alibaba.fastjson.JSON;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.common.core.constant.TokenConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import org.apache.logging.log4j.core.config.Order;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
 * @author zhibing.pu
 * @Date 2024/8/23 11:22
 */
@Order(-200)
@Component
public class AuthFilter implements Filter {
   private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
   @Lazy
   @Resource
   private AppUserClient appUserClient;
   @Lazy
   @Resource
   private SysUserClient sysUserClient;
   @Override
   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      HttpServletRequest request = (HttpServletRequest) servletRequest;
      HttpServletResponse response = (HttpServletResponse) servletResponse;
      String userid = request.getHeader("user_id");
      if(StringUtils.isEmpty(userid)){
         filterChain.doFilter(request, response);
         return;
      }
      String userType = request.getHeader("user_type");
      //管理后台用户
      if ("system".equals(userType)) {
         SysUser sysUser = sysUserClient.getSysUser(Long.valueOf(userid)).getData();
         if(null == sysUser || "2".equals(sysUser.getDelFlag())){
            log.error("[账户异常处理]请求账户id:{}", userid);
            unauthorizedResponse(response,"无效的账户");
            return;
         }
         if("1".equals(sysUser.getStatus())){
            log.error("[账户异常处理]请求账户id:{}", userid);
            unauthorizedResponse(response,"账户已被停用,请联系系统管理员!");
            return;
         }
      }
      //小程序用户
      if ("applet".equals(userType)) {
         TAppUser appUser = appUserClient.getUserById(Long.valueOf(userid)).getData();
         if(null == appUser || appUser.getDelFlag() || 3 == appUser.getStatus()){
            log.error("[账户异常处理]请求账户id:{}", userid);
            unauthorizedResponse(response,"无效的账户");
            return;
         }
         if(2 == appUser.getStatus()){
            log.error("[账户异常处理]请求账户id:{}", userid);
            unauthorizedResponse(response,"账户已被冻结,请联系系统管理员!");
            return;
         }
      }
      filterChain.doFilter(request, response);
   }
   private void unauthorizedResponse(HttpServletResponse response, String msg) {
      response.setStatus(HttpStatus.OK.value());
      response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE);
      PrintWriter writer = null;
      try {
         writer = response.getWriter();
      } catch (IOException e) {
         throw new RuntimeException(e);
      }
      writer.println(JSON.toJSONString(R.fail(msg)));
      writer.flush();
      writer.close();
   }
   /**
    * 获取请求token
    */
   private String getToken(HttpServletRequest request) {
      String token = request.getHeader(TokenConstants.AUTHENTICATION);
      // 如果前端设置了令牌前缀,则裁剪掉前缀
      if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) {
         token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
      }
      return token;
   }
}