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