package com.ruoyi.system.filter;
|
|
import com.alibaba.fastjson.JSON;
|
import com.ruoyi.account.api.feignClient.AppUserClient;
|
import com.ruoyi.account.api.model.AppUser;
|
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.service.ISysUserService;
|
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 ISysUserService sysUserService;
|
|
|
@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 ("mapping/system".equals(userType)) {
|
SysUser sysUser = sysUserService.getById(userid);
|
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)) {
|
AppUser appUser = appUserClient.getAppUserById(Long.valueOf(userid));
|
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(servletRequest, servletResponse);
|
}
|
|
|
|
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;
|
}
|
|
|
}
|