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 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 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 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 { } }