package com.matrix.system.common.interceptor;
|
|
import com.matrix.core.constance.MatrixConstance;
|
import com.matrix.core.constance.SystemErrorCode;
|
import com.matrix.core.exception.GlobleException;
|
import com.matrix.core.tools.LogUtil;
|
import com.matrix.core.tools.WebUtil;
|
import com.matrix.system.common.authority.DefaultAuthorityManager;
|
import com.matrix.system.common.bean.SysUsers;
|
import com.matrix.system.common.constance.AppConstance;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.AntPathMatcher;
|
import org.springframework.util.PathMatcher;
|
import org.springframework.web.servlet.HandlerInterceptor;
|
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.util.UrlPathHelper;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.Comparator;
|
import java.util.List;
|
|
/**
|
* 权限拦截器
|
*
|
* @author JIANGYOUYAO
|
* @email 935090232@qq.com
|
* @date 2017年11月30日
|
*/
|
@Component
|
public class SuAuthorityInterceptor implements HandlerInterceptor {
|
|
private UrlPathHelper urlPathHelper = new UrlPathHelper();
|
private PathMatcher pathMatcher = new AntPathMatcher();
|
@Override
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
|
|
// 开发人员和超级管理员具有所有权限,这段代码如果在生产环境建议删除,避免系统漏洞
|
SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
|
if (AppConstance.USER_TYPE_DEVELOPER.equals(user.getSuUserType())
|
|| AppConstance.USER_TYPE_SUPER.equals(user.getSuUserType())) {
|
return true;
|
}
|
|
|
// 用户已经登录校验权限
|
List<String> mapping = WebUtil.getSessionAttribute(DefaultAuthorityManager.USER_URL_MAPPING);
|
// 是否允许访问
|
boolean isAccess = false;
|
|
String lookupPath = urlPathHelper.getLookupPathForRequest(request);
|
LogUtil.debug("request url =" + lookupPath);
|
isAccess = mapping.contains(lookupPath);
|
if (!isAccess) {
|
|
LogUtil.debug("未匹配到用户权限,尝试通过正则表达式查找");
|
|
List<String> matchingPatterns = new ArrayList<>();
|
for (String registeredPattern : mapping) {
|
if (pathMatcher.match(registeredPattern, lookupPath)) {
|
matchingPatterns.add(registeredPattern);
|
} else {
|
if (!registeredPattern.endsWith("/") && pathMatcher.match(registeredPattern + "/", lookupPath)) {
|
matchingPatterns.add(registeredPattern + "/");
|
}
|
}
|
}
|
|
// 获取到请求对应的正则表达式路径
|
String bestMatch = null;
|
Comparator<String> patternComparator = pathMatcher.getPatternComparator(lookupPath);
|
if (!matchingPatterns.isEmpty()) {
|
Collections.sort(matchingPatterns, patternComparator);
|
LogUtil.debug("请求的匹配模式 [" + lookupPath + "] = " + matchingPatterns);
|
bestMatch = matchingPatterns.get(0);
|
}
|
// 根据正则表达式,查询mapping中是否存在对应的路径
|
if (bestMatch != null) {
|
|
isAccess = mapping.contains(bestMatch);
|
|
if (!isAccess) {
|
if (bestMatch.endsWith("/")) {
|
isAccess = mapping.contains(bestMatch.substring(0, bestMatch.length() - 1));
|
}
|
if (!isAccess) {
|
LogUtil.debug("在用户权限列表中没有匹配到对应的正则表达式路径");
|
throw new GlobleException(SystemErrorCode.PERMISSION_DENIED);
|
}
|
}
|
} else {
|
LogUtil.debug("在用户权限列表中没有匹配到对应的正则表达式路径");
|
throw new GlobleException(SystemErrorCode.PERMISSION_DENIED);
|
}
|
}
|
return isAccess;
|
}
|
|
@Override
|
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
|
throws Exception {
|
}
|
@Override
|
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
|
throws Exception {
|
}
|
}
|