package com.moon.server.interceptor;
|
|
import com.alibaba.fastjson.JSON;
|
import com.moon.server.entity.all.HttpStatus;
|
import com.moon.server.entity.all.ResponseMsg;
|
import com.moon.server.entity.sys.TokenEntity;
|
import com.moon.server.entity.sys.UserEntity;
|
import com.moon.server.helper.StringHelper;
|
import com.moon.server.helper.WebHelper;
|
import com.moon.server.service.all.SysService;
|
import com.moon.server.entity.all.StaticData;
|
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.LogFactory;
|
import org.springframework.context.annotation.Configuration;
|
import org.springframework.web.method.HandlerMethod;
|
import org.springframework.web.servlet.HandlerInterceptor;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.util.List;
|
|
/**
|
* 身份认证拦截器
|
* @author WWW
|
*/
|
@Configuration
|
public class AuthInterceptor implements HandlerInterceptor {
|
private final SysService sysService;
|
|
private static final Log log = LogFactory.getLog(AuthInterceptor.class);
|
|
public static final String NO_TOKEN = JSON.toJSONString(new ResponseMsg<String>(HttpStatus.TOKEN_ERROR, "找不到令牌"));
|
|
public static final String NO_LOGIN = JSON.toJSONString(new ResponseMsg<String>(HttpStatus.NO_LOGIN_ERROR, "用户未登录"));
|
|
public static final String USER_LOCK = JSON.toJSONString(new ResponseMsg<String>(HttpStatus.USER_LOCK_ERROR, "用户ID已禁用"));
|
|
public static final String NO_AUTH = JSON.toJSONString(new ResponseMsg<String>(HttpStatus.NO_AUTH_ERROR, "无权限访问"));
|
|
public static final String IP_NULL = JSON.toJSONString(new ResponseMsg<String>(HttpStatus.UNAUTHORIZED, "IP地址为空"));
|
|
public static final String BLACK_LIST = JSON.toJSONString(new ResponseMsg<String>(HttpStatus.UNAUTHORIZED, "IP列入黑名单"));
|
|
public static final String ILLEGAL_TOKEN = JSON.toJSONString(new ResponseMsg<String>(HttpStatus.UNAUTHORIZED, "令牌来源非法"));
|
|
public AuthInterceptor(SysService sysService) {
|
this.sysService = sysService;
|
}
|
|
/**
|
* Controller执行之前执行,如果返回值是true则代表放行,返回false则拦截
|
*/
|
@Override
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
|
// noinspection AlibabaRemoveCommentedCode
|
try {
|
// 1.非方法 或 无需授权,无需拦截
|
if (!(handler instanceof HandlerMethod) || noNeedAuth(request)) {
|
return true;
|
}
|
|
// 2.获取令牌
|
String token = WebHelper.getToken(request);
|
if (StringHelper.isNull(token)) {
|
return WebHelper.writeStr2Page(response, NO_TOKEN);
|
}
|
|
// 3.获取用户
|
UserEntity ue = sysService.tokenService.getCurrentUser(request);
|
if (ue == null) {
|
return WebHelper.writeStr2Page(response, NO_LOGIN);
|
}
|
|
// 4.获取IP
|
String ip = WebHelper.getIpAddress(request);
|
if (StringHelper.isEmpty(ip)) {
|
return WebHelper.writeStr2Page(response, IP_NULL);
|
}
|
|
// 5.检查黑名单
|
if (!checkBlackList(ip, request)) {
|
return WebHelper.writeStr2Page(response, BLACK_LIST);
|
}
|
|
// 6.admin跳过权限检测
|
if (StaticData.ADMIN.equals(ue.getUid())) {
|
return true;
|
}
|
|
// 7.检查白名单
|
if (!checkWhiteList(ip, request)) {
|
// 检查IP一致性
|
if (!checkIpSource(ip, token)) {
|
return WebHelper.writeStr2Page(response, ILLEGAL_TOKEN);
|
}
|
}
|
|
// 8.检查用户ID是否禁用
|
if (sysService.tokenService.isUidDisable(ue)) {
|
return WebHelper.writeStr2Page(response, USER_LOCK);
|
}
|
|
// 9.权限校验
|
if (!checkPerms(ue, request)) {
|
System.out.println("无权限访问:" + request.getRequestURI().toLowerCase());
|
return WebHelper.writeStr2Page(response, NO_AUTH);
|
}
|
|
return true;
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
return false;
|
}
|
}
|
|
/**
|
* 无需授权
|
*/
|
private static boolean noNeedAuth(HttpServletRequest request) {
|
String uri = request.getRequestURI().toLowerCase();
|
for (String page : StaticData.EXCLUDE_PATH) {
|
if (uri.contains(page)) {
|
return true;
|
}
|
}
|
|
return false;
|
}
|
|
/**
|
* 检查权限
|
*/
|
private boolean checkPerms(UserEntity ue, HttpServletRequest request) {
|
List<String> list = sysService.permsService.selectPerms(ue.getUid());
|
if (list == null || list.size() == 0) {
|
return false;
|
}
|
|
String url = request.getRequestURI();
|
for (String perm : list) {
|
if (url.contains(perm)) {
|
return true;
|
}
|
}
|
|
return false;
|
}
|
|
/**
|
* 检查黑名单
|
*/
|
private boolean checkBlackList(String ip, HttpServletRequest request) {
|
List<String> blackList = sysService.blacklistService.selectIpList(1);
|
if (blackList == null || blackList.isEmpty()) {
|
return true;
|
}
|
if (blackList.contains(ip)) {
|
return false;
|
}
|
|
return true;
|
}
|
|
/**
|
* 检查白名单
|
*/
|
private boolean checkWhiteList(String ip, HttpServletRequest request) {
|
List<String> whiteList = sysService.blacklistService.selectIpList(2);
|
if (whiteList == null || whiteList.isEmpty()) {
|
return false;
|
}
|
|
return whiteList.contains(ip);
|
}
|
|
/**
|
* 检查IP一致性
|
*/
|
private boolean checkIpSource(String ip, String token) {
|
TokenEntity te = sysService.tokenService.getEntityByToken(token);
|
|
return te.getIp().equals(ip);
|
}
|
}
|