{"id":1270,"date":"2017-04-05T15:49:40","date_gmt":"2017-04-05T07:49:40","guid":{"rendered":"http:\/\/www.xttblog.com\/?p=1270"},"modified":"2017-04-05T15:49:40","modified_gmt":"2017-04-05T07:49:40","slug":"shiro-%e5%8a%a8%e6%80%81url%e6%9d%83%e9%99%90%e7%ae%a1%e7%90%86","status":"publish","type":"post","link":"https:\/\/www.xttblog.com\/?p=1270","title":{"rendered":"Shiro \u52a8\u6001URL\u6743\u9650\u7ba1\u7406"},"content":{"rendered":"<p>\n\t\u8fd9\u662fShiro \u6559\u7a0b\u7684\u6700\u6709\u4e00\u7bc7\u6587\u7ae0\u4e86\uff0c\u672c\u6587\u5c06\u91cd\u70b9\u5b66\u4e60\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\u7684\u52a8\u6001URL\u6743\u9650\u7ba1\u7406\u529f\u80fd\u3002\n<\/p>\n<p>\n\t\u7528\u8fc7<a href=\"http:\/\/projects.spring.io\/spring-security\/\" name=\"Spring Security\" target=\"_blank\" title=\"Spring Security\">Spring Security<\/a>\u7684\u670b\u53cb\u5e94\u8be5\u6bd4\u8f83\u719f\u6089\u5bf9URL\u8fdb\u884c\u5168\u5c40\u7684\u6743\u9650\u63a7\u5236\uff0c\u5373\u8bbf\u95eeURL\u65f6\u8fdb\u884c\u6743\u9650\u5339\u914d\uff1b\u5982\u679c\u6ca1\u6709\u6743\u9650\u76f4\u63a5\u8df3\u5230\u76f8\u5e94\u7684\u9519\u8bef\u9875\u9762\u3002Shiro\u4e5f\u652f\u6301\u7c7b\u4f3c\u7684\u673a\u5236\uff0c\u4e0d\u8fc7\u9700\u8981\u7a0d\u5fae\u6539\u9020\u4e0b\u6765\u6ee1\u8db3\u5b9e\u9645\u9700\u6c42\u3002\u4e0d\u8fc7\u5728Shiro\u4e2d\uff0c\u66f4\u591a\u7684\u662f\u901a\u8fc7AOP\u8fdb\u884c\u5206\u6563\u7684\u6743\u9650\u63a7\u5236\uff0c\u5373\u65b9\u6cd5\u7ea7\u522b\u7684\uff1b\u800c\u901a\u8fc7URL\u8fdb\u884c\u6743\u9650\u63a7\u5236\u662f\u4e00\u79cd\u96c6\u4e2d\u7684\u6743\u9650\u63a7\u5236\u3002\u672c\u7ae0\u5c06\u4ecb\u7ecd\u5982\u4f55\u5728Shiro\u4e2d\u5b8c\u6210\u52a8\u6001URL\u6743\u9650\u63a7\u5236\u3002\n<\/p>\n<h2>\n\t\u52a8\u6001URL\u5b9e\u4f53\u7c7b<br \/>\n<\/h2>\n<p>\n\tcom.xttblog.shiro20.entity.UrlFilter\n<\/p>\n<pre class=\"brush:java;\">\r\npublic class UrlFilter implements Serializable {  \r\n    private Long id;  \r\n    private String name; \/\/url\u540d\u79f0\/\u63cf\u8ff0  \r\n    private String url; \/\/\u5730\u5740  \r\n    private String roles; \/\/\u6240\u9700\u8981\u7684\u89d2\u8272\uff0c\u53ef\u7701\u7565  \r\n    private String permissions; \/\/\u6240\u9700\u8981\u7684\u6743\u9650\uff0c\u53ef\u7701\u7565  \r\n}  <\/pre>\n<p>\n\t\u8868\u793a\u62e6\u622a\u7684URL\u548c\u89d2\u8272\/\u6743\u9650\u4e4b\u95f4\u7684\u5173\u7cfb\uff0c\u591a\u4e2a\u89d2\u8272\/\u6743\u9650\u4e4b\u95f4\u901a\u8fc7\u9017\u53f7\u5206\u9694\uff0c\u6b64\u5904\u8fd8\u53ef\u4ee5\u6269\u5c55\u5176\u4ed6\u7684\u5173\u7cfb\uff0c\u53e6\u5916\u53ef\u4ee5\u52a0\u5982available\u5c5e\u6027\u8868\u793a\u662f\u5426\u5f00\u542f\u8be5\u62e6\u622a\u3002\n<\/p>\n<h2>\n\tURL\u62e6\u622a\u5668\u94fe<br \/>\n<\/h2>\n<pre class=\"brush:java;\">\r\n@Service  \r\npublic class UrlFilterServiceImpl implements UrlFilterService {  \r\n    @Autowired  \r\nprivate ShiroFilerChainManager shiroFilerChainManager;  \r\n  \r\n    @Override  \r\n    public UrlFilter createUrlFilter(UrlFilter urlFilter) {  \r\n        urlFilterDao.createUrlFilter(urlFilter);  \r\n        initFilterChain();  \r\n        return urlFilter;  \r\n    }  \r\n    \/\/\u5176\u4ed6\u65b9\u6cd5\u8bf7\u53c2\u8003\u6e90\u7801  \r\n    @PostConstruct  \r\n    public void initFilterChain() {  \r\n        shiroFilerChainManager.initFilterChains(findAll());  \r\n    }  \r\n}   <\/pre>\n<p>\n\tUrlFilterServiceImpl\u5728\u8fdb\u884c\u65b0\u589e\u3001\u4fee\u6539\u3001\u5220\u9664\u65f6\u4f1a\u8c03\u7528initFilterChain\u6765\u91cd\u65b0\u521d\u59cb\u5316Shiro\u7684URL\u62e6\u622a\u5668\u94fe\uff0c\u5373\u540c\u6b65\u6570\u636e\u5e93\u4e2d\u7684URL\u62e6\u622a\u5668\u5b9a\u4e49\u5230Shiro\u4e2d\u3002\u6b64\u5904\u4e5f\u8981\u6ce8\u610f\u5982\u679c\u76f4\u63a5\u4fee\u6539\u6570\u636e\u5e93\u662f\u4e0d\u4f1a\u8d77\u4f5c\u7528\u7684\uff0c\u56e0\u4e3a\u53ea\u8981\u8c03\u7528\u8fd9\u51e0\u4e2aService\u65b9\u6cd5\u65f6\u624d\u540c\u6b65\u3002\u53e6\u5916\u5f53\u5bb9\u5668\u542f\u52a8\u65f6\u4f1a\u81ea\u52a8\u56de\u8c03initFilterChain\u6765\u5b8c\u6210\u5bb9\u5668\u542f\u52a8\u540e\u7684URL\u62e6\u622a\u5668\u7684\u6ce8\u518c\u3002\n<\/p>\n<h2>\n\tShiroFilerChainManager<br \/>\n<\/h2>\n<pre class=\"brush:java;\">\r\n@Service  \r\npublic class ShiroFilerChainManager {  \r\n    @Autowired private DefaultFilterChainManager filterChainManager;  \r\n    private Map&lt;String, NamedFilterList&gt; defaultFilterChains;  \r\n    @PostConstruct  \r\n    public void init() {  \r\n        defaultFilterChains =   \r\n          new HashMap&lt;String, NamedFilterList&gt;(filterChainManager.getFilterChains());  \r\n    }  \r\n    public void initFilterChains(List&lt;UrlFilter&gt; urlFilters) {  \r\n        \/\/1\u3001\u9996\u5148\u5220\u9664\u4ee5\u524d\u8001\u7684filter chain\u5e76\u6ce8\u518c\u9ed8\u8ba4\u7684  \r\n        filterChainManager.getFilterChains().clear();  \r\n        if(defaultFilterChains != null) {  \r\n            filterChainManager.getFilterChains().putAll(defaultFilterChains);  \r\n        }  \r\n        \/\/2\u3001\u5faa\u73afURL Filter \u6ce8\u518cfilter chain  \r\n        for (UrlFilter urlFilter : urlFilters) {  \r\n            String url = urlFilter.getUrl();  \r\n            \/\/\u6ce8\u518croles filter  \r\n            if (!StringUtils.isEmpty(urlFilter.getRoles())) {  \r\n                filterChainManager.addToChain(url, &quot;roles&quot;, urlFilter.getRoles());  \r\n            }  \r\n            \/\/\u6ce8\u518cperms filter  \r\n            if (!StringUtils.isEmpty(urlFilter.getPermissions())) {  \r\n                filterChainManager.addToChain(url, &quot;perms&quot;, urlFilter.getPermissions());  \r\n            }  \r\n        }  \r\n    }  \r\n}   <\/pre>\n<ul>\n<li>\n\t\tinit\uff1aSpring\u5bb9\u5668\u542f\u52a8\u65f6\u4f1a\u8c03\u7528init\u65b9\u6cd5\u628a\u5728spring\u914d\u7f6e\u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u9ed8\u8ba4\u62e6\u622a\u5668\u4fdd\u5b58\u4e0b\u6765\uff0c\u4e4b\u540e\u4f1a\u81ea\u52a8\u4e0e\u6570\u636e\u5e93\u4e2d\u7684\u914d\u7f6e\u8fdb\u884c\u5408\u5e76\u3002\n\t<\/li>\n<li>\n\t\tinitFilterChains\uff1aUrlFilterServiceImpl\u4f1a\u5728Spring\u5bb9\u5668\u542f\u52a8\u6216\u8fdb\u884c\u589e\u5220\u6539UrlFilter\u65f6\u8fdb\u884c\u6ce8\u518cURL\u62e6\u622a\u5668\u5230Shiro\u3002\n\t<\/li>\n<\/ul>\n<p>\n\t\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u5982\u4f7f\u7528ShiroFilterFactoryBean\u521b\u5efashiroFilter\u65f6\uff0c\u9ed8\u8ba4\u4f7f\u7528PathMatchingFilterChainResolver\u8fdb\u884c\u89e3\u6790\uff0c\u800c\u5b83\u9ed8\u8ba4\u662f\u6839\u636e\u5f53\u524d\u8bf7\u6c42\u7684URL\u83b7\u53d6\u76f8\u5e94\u7684\u62e6\u622a\u5668\u94fe\uff0c\u4f7f\u7528Ant\u6a21\u5f0f\u8fdb\u884cURL\u5339\u914d\uff1b\u9ed8\u8ba4\u4f7f\u7528DefaultFilterChainManager\u8fdb\u884c\u62e6\u622a\u5668\u94fe\u7684\u7ba1\u7406\u3002\n<\/p>\n<p>\n\tPathMatchingFilterChainResolver\u9ed8\u8ba4\u6d41\u7a0b\uff1a\n<\/p>\n<pre class=\"brush:java;\">\r\npublic FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain) {  \r\n    \/\/1\u3001\u9996\u5148\u83b7\u53d6\u62e6\u622a\u5668\u94fe\u7ba1\u7406\u5668  \r\n    FilterChainManager filterChainManager = getFilterChainManager();  \r\n    if (!filterChainManager.hasChains()) {  \r\n        return null;  \r\n    }  \r\n    \/\/2\u3001\u63a5\u7740\u83b7\u53d6\u5f53\u524d\u8bf7\u6c42\u7684URL\uff08\u4e0d\u5e26\u4e0a\u4e0b\u6587\uff09  \r\n    String requestURI = getPathWithinApplication(request);  \r\n    \/\/3\u3001\u5faa\u73af\u62e6\u622a\u5668\u7ba1\u7406\u5668\u4e2d\u7684\u62e6\u622a\u5668\u5b9a\u4e49\uff08\u62e6\u622a\u5668\u94fe\u7684\u540d\u5b57\u5c31\u662fURL\u6a21\u5f0f\uff09  \r\n    for (String pathPattern : filterChainManager.getChainNames()) {  \r\n        \/\/4\u3001\u5982\u5f53\u524dURL\u5339\u914d\u62e6\u622a\u5668\u540d\u5b57\uff08URL\u6a21\u5f0f\uff09  \r\n        if (pathMatches(pathPattern, requestURI)) {  \r\n            \/\/5\u3001\u8fd4\u56de\u8be5URL\u6a21\u5f0f\u5b9a\u4e49\u7684\u62e6\u622a\u5668\u94fe  \r\n            return filterChainManager.proxy(originalChain, pathPattern);  \r\n        }  \r\n    }  \r\n    return null;  \r\n}<\/pre>\n<p>\n\t\u9ed8\u8ba4\u5b9e\u73b0\u6709\u70b9\u5c0f\u95ee\u9898\uff1a<br \/>\n\t\u5982\u679c\u591a\u4e2a\u62e6\u622a\u5668\u94fe\u90fd\u5339\u914d\u4e86\u5f53\u524d\u8bf7\u6c42URL\uff0c\u90a3\u4e48\u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a\u627e\u5230\u7684\u62e6\u622a\u5668\u94fe\uff1b\u540e\u7eed\u6211\u4eec\u53ef\u4ee5\u4fee\u6539\u6b64\u5904\u7684\u4ee3\u7801\uff0c\u5c06\u591a\u4e2a\u5339\u914d\u7684\u62e6\u622a\u5668\u94fe\u5408\u5e76\u8fd4\u56de\u3002<br \/>\n\tDefaultFilterChainManager\u5185\u90e8\u4f7f\u7528Map\u6765\u7ba1\u7406URL\u6a21\u5f0f-\u62e6\u622a\u5668\u94fe\u7684\u5173\u7cfb\uff1b\u4e5f\u5c31\u662f\u8bf4\u76f8\u540c\u7684URL\u6a21\u5f0f\u53ea\u80fd\u5b9a\u4e49\u4e00\u4e2a\u62e6\u622a\u5668\u94fe\uff0c\u4e0d\u80fd\u91cd\u590d\u5b9a\u4e49\uff1b\u800c\u4e14\u5982\u679c\u591a\u4e2a\u62e6\u622a\u5668\u94fe\u90fd\u5339\u914d\u65f6\u662f\u65e0\u5e8f\u7684\uff08\u56e0\u4e3a\u4f7f\u7528map.keySet()\u83b7\u53d6\u62e6\u622a\u5668\u94fe\u7684\u540d\u5b57\uff0c\u5373URL\u6a21\u5f0f\uff09\u3002\n<\/p>\n<h2>\n\tFilterChainManager\u63a5\u53e3<br \/>\n<\/h2>\n<pre class=\"brush:java;\">\r\npublic interface FilterChainManager {  \r\n    Map&lt;String, Filter&gt; getFilters(); \/\/\u5f97\u5230\u6ce8\u518c\u7684\u62e6\u622a\u5668  \r\n    void addFilter(String name, Filter filter); \/\/\u6ce8\u518c\u62e6\u622a\u5668  \r\n    void addFilter(String name, Filter filter, boolean init); \/\/\u6ce8\u518c\u62e6\u622a\u5668  \r\n    void createChain(String chainName, String chainDefinition); \/\/\u6839\u636e\u62e6\u622a\u5668\u94fe\u5b9a\u4e49\u521b\u5efa\u62e6\u622a\u5668\u94fe  \r\n    void addToChain(String chainName, String filterName); \/\/\u6dfb\u52a0\u62e6\u622a\u5668\u5230\u6307\u5b9a\u7684\u62e6\u622a\u5668\u94fe  \r\n    void addToChain(String chainName, String filterName, String chainSpecificFilterConfig) throws ConfigurationException; \/\/\u6dfb\u52a0\u62e6\u622a\u5668\uff08\u5e26\u6709\u914d\u7f6e\u7684\uff09\u5230\u6307\u5b9a\u7684\u62e6\u622a\u5668\u94fe  \r\n    NamedFilterList getChain(String chainName); \/\/\u83b7\u53d6\u62e6\u622a\u5668\u94fe  \r\n    boolean hasChains(); \/\/\u662f\u5426\u6709\u62e6\u622a\u5668\u94fe  \r\n    Set&lt;String&gt; getChainNames(); \/\/\u5f97\u5230\u6240\u6709\u62e6\u622a\u5668\u94fe\u7684\u540d\u5b57  \r\n    FilterChain proxy(FilterChain original, String chainName); \/\/\u4f7f\u7528\u6307\u5b9a\u7684\u62e6\u622a\u5668\u94fe\u4ee3\u7406\u539f\u59cb\u62e6\u622a\u5668\u94fe  \r\n} <\/pre>\n<p>\n\t\u6b64\u63a5\u53e3\u4e3b\u8981\u4e09\u4e2a\u529f\u80fd\uff1a\u6ce8\u518c\u62e6\u622a\u5668\uff0c\u6ce8\u518c\u62e6\u622a\u5668\u94fe\uff0c\u5bf9\u539f\u59cb\u62e6\u622a\u5668\u94fe\u751f\u6210\u4ee3\u7406\u4e4b\u540e\u7684\u62e6\u622a\u5668\u94fe\uff0c\u6bd4\u5982\n<\/p>\n<pre class=\"brush:xml;\">\r\n&lt;bean id=&quot;shiroFilter&quot; class=&quot;org.apache.shiro.spring.web.ShiroFilterFactoryBean&quot;&gt;  \r\n&hellip;&hellip;  \r\n    &lt;property name=&quot;filters&quot;&gt;  \r\n        &lt;util:map&gt;  \r\n            &lt;entry key=&quot;authc&quot; value-ref=&quot;formAuthenticationFilter&quot;\/&gt;  \r\n            &lt;entry key=&quot;sysUser&quot; value-ref=&quot;sysUserFilter&quot;\/&gt;  \r\n        &lt;\/util:map&gt;  \r\n    &lt;\/property&gt;  \r\n    &lt;property name=&quot;filterChainDefinitions&quot;&gt;  \r\n        &lt;value&gt;  \r\n            \/login = authc  \r\n            \/logout = logout  \r\n            \/authenticated = authc  \r\n            \/** = user,sysUser  \r\n        &lt;\/value&gt;  \r\n    &lt;\/property&gt;  \r\n&lt;\/bean&gt;  <\/pre>\n<p>\n\tfilters\u5c5e\u6027\u5b9a\u4e49\u4e86\u62e6\u622a\u5668\uff1bfilterChainDefinitions\u5b9a\u4e49\u4e86\u62e6\u622a\u5668\u94fe\uff1b\u5982\/**\u5c31\u662f\u62e6\u622a\u5668\u94fe\u7684\u540d\u5b57\uff1b\u800cuser,sysUser\u5c31\u662f\u62e6\u622a\u5668\u540d\u5b57\u5217\u8868\u3002<br \/>\n\t&nbsp;<br \/>\n\t\u4e4b\u524d\u8bf4\u8fc7\u9ed8\u8ba4\u7684PathMatchingFilterChainResolver\u548cDefaultFilterChainManager\u4e0d\u80fd\u6ee1\u8db3\u6211\u4eec\u7684\u9700\u6c42\uff0c\u6211\u4eec\u7a0d\u5fae\u6269\u5c55\u4e86\u4e00\u4e0b\uff1a\n<\/p>\n<pre class=\"brush:java;\">\r\npublic class CustomPathMatchingFilterChainResolver  \r\n             extends PathMatchingFilterChainResolver {  \r\n  private CustomDefaultFilterChainManager customDefaultFilterChainManager;  \r\n  public void setCustomDefaultFilterChainManager(  \r\n        CustomDefaultFilterChainManager customDefaultFilterChainManager) {  \r\n      this.customDefaultFilterChainManager = customDefaultFilterChainManager;  \r\n      setFilterChainManager(customDefaultFilterChainManager);  \r\n  }  \r\n  \r\n  public FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain) {  \r\n      FilterChainManager filterChainManager = getFilterChainManager();  \r\n      if (!filterChainManager.hasChains()) {  \r\n          return null;  \r\n      }  \r\n      String requestURI = getPathWithinApplication(request);  \r\n      List&lt;String&gt; chainNames = new ArrayList&lt;String&gt;();  \r\n      for (String pathPattern : filterChainManager.getChainNames()) {  \r\n        if (pathMatches(pathPattern, requestURI)) {  \r\n        chainNames.add(pathPattern);  \r\n        }  \r\n      }  \r\n      if(chainNames.size() == 0) {  \r\n        return null;  \r\n      }  \r\n      return customDefaultFilterChainManager.proxy(originalChain, chainNames);  \r\n  }  \r\n}   <\/pre>\n<p>\n\t\u548c\u9ed8\u8ba4\u7684PathMatchingFilterChainResolver\u533a\u522b\u662f\uff0c\u6b64\u5904\u5f97\u5230\u6240\u6709\u5339\u914d\u7684\u62e6\u622a\u5668\u94fe\uff0c\u7136\u540e\u901a\u8fc7\u8c03\u7528CustomDefaultFilterChainManager.proxy(originalChain, chainNames)\u8fdb\u884c\u5408\u5e76\u540e\u4ee3\u7406\u3002\n<\/p>\n<pre class=\"brush:java;\">\r\npublic class CustomDefaultFilterChainManager extends DefaultFilterChainManager {  \r\n    private Map&lt;String, String&gt; filterChainDefinitionMap = null;  \r\n    private String loginUrl;  \r\n    private String successUrl;  \r\n    private String unauthorizedUrl;  \r\n    public CustomDefaultFilterChainManager() {  \r\n        setFilters(new LinkedHashMap&lt;String, Filter&gt;());  \r\n        setFilterChains(new LinkedHashMap&lt;String, NamedFilterList&gt;());  \r\n        addDefaultFilters(true);  \r\n    }  \r\n    public Map&lt;String, String&gt; getFilterChainDefinitionMap() {  \r\n        return filterChainDefinitionMap;  \r\n    }  \r\n    public void setFilterChainDefinitionMap(Map&lt;String, String&gt; filterChainDefinitionMap) {  \r\n        this.filterChainDefinitionMap = filterChainDefinitionMap;  \r\n    }  \r\n    public void setCustomFilters(Map&lt;String, Filter&gt; customFilters) {  \r\n        for(Map.Entry&lt;String, Filter&gt; entry : customFilters.entrySet()) {  \r\n            addFilter(entry.getKey(), entry.getValue(), false);  \r\n        }  \r\n}  \r\n    public void setDefaultFilterChainDefinitions(String definitions) {  \r\n        Ini ini = new Ini();  \r\n        ini.load(definitions);  \r\n        Ini.Section section = ini.getSection(IniFilterChainResolverFactory.URLS);  \r\n        if (CollectionUtils.isEmpty(section)) {  \r\n            section = ini.getSection(Ini.DEFAULT_SECTION_NAME);  \r\n        }  \r\n        setFilterChainDefinitionMap(section);  \r\n    }  \r\n    public String getLoginUrl() {  \r\n        return loginUrl;  \r\n    }  \r\n    public void setLoginUrl(String loginUrl) {  \r\n        this.loginUrl = loginUrl;  \r\n    }  \r\n    public String getSuccessUrl() {  \r\n        return successUrl;  \r\n    }  \r\n    public void setSuccessUrl(String successUrl) {  \r\n        this.successUrl = successUrl;  \r\n    }  \r\n    public String getUnauthorizedUrl() {  \r\n        return unauthorizedUrl;  \r\n    }  \r\n    public void setUnauthorizedUrl(String unauthorizedUrl) {  \r\n        this.unauthorizedUrl = unauthorizedUrl;  \r\n    }  \r\n    @PostConstruct  \r\n    public void init() {  \r\n        Map&lt;String, Filter&gt; filters = getFilters();  \r\n        if (!CollectionUtils.isEmpty(filters)) {  \r\n            for (Map.Entry&lt;String, Filter&gt; entry : filters.entrySet()) {  \r\n                String name = entry.getKey();  \r\n                Filter filter = entry.getValue();  \r\n                applyGlobalPropertiesIfNecessary(filter);  \r\n                if (filter instanceof Nameable) {  \r\n                    ((Nameable) filter).setName(name);  \r\n                }  \r\n                addFilter(name, filter, false);  \r\n            }  \r\n        }  \r\n        Map&lt;String, String&gt; chains = getFilterChainDefinitionMap();  \r\n        if (!CollectionUtils.isEmpty(chains)) {  \r\n            for (Map.Entry&lt;String, String&gt; entry : chains.entrySet()) {  \r\n                String url = entry.getKey();  \r\n                String chainDefinition = entry.getValue();  \r\n                createChain(url, chainDefinition);  \r\n            }  \r\n        }  \r\n    }  \r\n    protected void initFilter(Filter filter) {  \r\n        \/\/ignore   \r\n    }  \r\n  \r\n    public FilterChain proxy(FilterChain original, List&lt;String&gt; chainNames) {  \r\n        NamedFilterList configured = new SimpleNamedFilterList(chainNames.toString());  \r\n        for(String chainName : chainNames) {  \r\n            configured.addAll(getChain(chainName));  \r\n        }  \r\n        return configured.proxy(original);  \r\n    }  \r\n    private void applyGlobalPropertiesIfNecessary(Filter filter) {  \r\n        applyLoginUrlIfNecessary(filter);  \r\n        applySuccessUrlIfNecessary(filter);  \r\n        applyUnauthorizedUrlIfNecessary(filter);  \r\n    }  \r\n    private void applyLoginUrlIfNecessary(Filter filter) {  \r\n        \/\/\u8bf7\u53c2\u8003\u6e90\u7801  \r\n    }  \r\n    private void applySuccessUrlIfNecessary(Filter filter) {  \r\n        \/\/\u8bf7\u53c2\u8003\u6e90\u7801  \r\n    }  \r\n    private void applyUnauthorizedUrlIfNecessary(Filter filter) {  \r\n        \/\/\u8bf7\u53c2\u8003\u6e90\u7801  \r\n    }  \r\n}   <\/pre>\n<ul>\n<li>\n\t\tCustomDefaultFilterChainManager\uff1a\u8c03\u7528\u5176\u6784\u9020\u5668\u65f6\uff0c\u4f1a\u81ea\u52a8\u6ce8\u518c\u9ed8\u8ba4\u7684\u62e6\u622a\u5668\uff1b\n\t<\/li>\n<li>\n\t\tloginUrl\u3001successUrl\u3001unauthorizedUrl\uff1a\u5206\u522b\u5bf9\u5e94\u767b\u5f55\u5730\u5740\u3001\u767b\u5f55\u6210\u529f\u540e\u9ed8\u8ba4\u8df3\u8f6c\u5730\u5740\u3001\u672a\u6388\u6743\u8df3\u8f6c\u5730\u5740\uff0c\u7528\u4e8e\u7ed9\u76f8\u5e94\u62e6\u622a\u5668\u7684\uff1b\n\t<\/li>\n<li>\n\t\tfilterChainDefinitionMap\uff1a\u7528\u4e8e\u5b58\u50a8\u5982ShiroFilterFactoryBean\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u62e6\u622a\u5668\u94fe\u5b9a\u4e49\uff0c\u5373\u53ef\u4ee5\u8ba4\u4e3a\u662f\u9ed8\u8ba4\u7684\u9759\u6001\u62e6\u622a\u5668\u94fe\uff1b\u4f1a\u81ea\u52a8\u4e0e\u6570\u636e\u5e93\u4e2d\u52a0\u8f7d\u7684\u5408\u5e76\uff1b\n\t<\/li>\n<li>\n\t\tsetDefaultFilterChainDefinitions\uff1a\u89e3\u6790\u914d\u7f6e\u6587\u4ef6\u4e2d\u4f20\u5165\u7684\u5b57\u7b26\u4e32\u62e6\u622a\u5668\u94fe\u914d\u7f6e\uff0c\u89e3\u6790\u4e3a\u76f8\u5e94\u7684\u62e6\u622a\u5668\u94fe\uff1b\n\t<\/li>\n<li>\n\t\tsetCustomFilters\uff1a\u6ce8\u518c\u6211\u4eec\u81ea\u5b9a\u4e49\u7684\u62e6\u622a\u5668\uff1b\u5982ShiroFilterFactoryBean\u7684filters\u5c5e\u6027\uff1b\n\t<\/li>\n<li>\n\t\tinit\uff1a\u521d\u59cb\u5316\u65b9\u6cd5\uff0cSpring\u5bb9\u5668\u542f\u52a8\u65f6\u4f1a\u8c03\u7528\uff0c\u9996\u5148\u5176\u4f1a\u81ea\u52a8\u7ed9\u76f8\u5e94\u7684\u62e6\u622a\u5668\u8bbe\u7f6e\u5982loginUrl\u3001successUrl\u3001unauthorizedUrl\uff1b\u5176\u6b21\u6839\u636efilterChainDefinitionMap\u6784\u5efa\u9ed8\u8ba4\u7684\u62e6\u622a\u5668\u94fe\uff1b\n\t<\/li>\n<li>\n\t\tinitFilter\uff1a\u6b64\u5904\u6211\u4eec\u5ffd\u7565\u5b9e\u73b0initFilter\uff0c\u56e0\u4e3a\u4ea4\u7ed9spring\u7ba1\u7406\u4e86\uff0c\u6240\u4ee5Filter\u7684\u76f8\u5173\u914d\u7f6e\u4f1a\u5728Spring\u914d\u7f6e\u4e2d\u5b8c\u6210\uff1b\n\t<\/li>\n<li>\n\t\tproxy\uff1a\u7ec4\u5408\u591a\u4e2a\u62e6\u622a\u5668\u94fe\u4e3a\u4e00\u4e2a\u751f\u6210\u4e00\u4e2a\u65b0\u7684FilterChain\u4ee3\u7406\u3002\n\t<\/li>\n<\/ul>\n<h2>\n\t\u8fd0\u884c\u6548\u679c<br \/>\n<\/h2>\n<p>\n\t<img decoding=\"async\" alt=\"Shiro \u6743\u9650\u7ba1\u7406\" src=\"http:\/\/img.bbs.csdn.net\/upload\/201704\/05\/1491378425_297244.png\" style=\"width: 336px;height: 202px\" \/>\n<\/p>\n<p>\n\t\u672c\u6587\u6e90\u4ee3\u7801\u4e0b\u8f7d\u94fe\u63a5\uff1a<a href=\"http:\/\/pan.baidu.com\/s\/1kV8yGsf\" name=\"Shiro \u6743\u9650\u7ba1\u7406\u9879\u76ee\u6e90\u7801\u4e0b\u8f7d\" target=\"_blank\" title=\"Shiro \u6743\u9650\u7ba1\u7406\u9879\u76ee\u6e90\u7801\u4e0b\u8f7d\">http:\/\/pan.baidu.com\/s\/1kV8yGsf<\/a> \u5bc6\u7801\uff1a8t5v<\/p>\n<!-- <audio autoplay=\"autoplay\" height=\"100\" width=\"100\" hidden=\"true\"><source src=\"https:\/\/c.coka.la\/orAvPR.mp3\" type=\"audio\/mp3\"\/><\/audio><img decoding=\"async\" src=\"https:\/\/images.weserv.nl\/?url=https:\/\/ws3.sinaimg.cn\/large\/8fa5dcfcgy1g4em3rzar5j20ib089ae0.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/> --><p><!-- <img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/xmt1139057136\/xttblog\/master\/8fa5dcfcgy1g4em3rzar5j20ib089ae0.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/>--><img decoding=\"async\" src=\"https:\/\/saas.51autoparts.cn\/api\/admin\/sys-file\/oss\/file?fileName=84db51f8561e448f9a4fda2eff0811f9.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/><\/p><p>\u6700\u540e\uff0c\u6b22\u8fce\u5173\u6ce8\u6211\u7684\u4e2a\u4eba\u5fae\u4fe1\u516c\u4f17\u53f7\uff1a\u4e1a\u4f59\u8349\uff08yyucao\uff09\uff01<b>\u53ef\u52a0\u4f5c\u8005\u5fae\u4fe1\u53f7\uff1a<font color=\"red\">xttblog2<\/font>\u3002\u5907\u6ce8\uff1a\u201c1\u201d\uff0c\u6dfb\u52a0\u535a\u4e3b\u5fae\u4fe1\u62c9\u4f60\u8fdb\u5fae\u4fe1\u7fa4\u3002\u5907\u6ce8\u9519\u8bef\u4e0d\u4f1a\u540c\u610f\u597d\u53cb\u7533\u8bf7\u3002<\/b>\u518d\u6b21\u611f\u8c22\u60a8\u7684\u5173\u6ce8\uff01\u540e\u7eed\u6709\u7cbe\u5f69\u5185\u5bb9\u4f1a\u7b2c\u4e00\u65f6\u95f4\u53d1\u7ed9\u60a8\uff01\u539f\u521b\u6587\u7ae0\u6295\u7a3f\u8bf7\u53d1\u9001\u81f3532009913@qq.com\u90ae\u7bb1\u3002\u5546\u52a1\u5408\u4f5c\u4e5f\u53ef\u6dfb\u52a0\u4f5c\u8005\u5fae\u4fe1\u8fdb\u884c\u8054\u7cfb\uff01<\/p><p>\u672c\u6587\u539f\u6587\u51fa\u5904\uff1a<a href=\"https:\/\/www.xttblog.com\">\u4e1a\u4f59\u8349<\/a>\uff1a &raquo; <a href=\"https:\/\/www.xttblog.com\/?p=1270\">Shiro \u52a8\u6001URL\u6743\u9650\u7ba1\u7406<\/a><\/p><!-- <div class=\"bd-reward-stl\"><button id=\"bdRewardBtn\"><span><\/span><\/button><\/div> -->","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u662fShiro \u6559\u7a0b\u7684\u6700\u6709\u4e00\u7bc7\u6587\u7ae0\u4e86\uff0c\u672c\u6587\u5c06\u91cd\u70b9\u5b66\u4e60\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\u7684\u52a8\u6001URL\u6743\u9650\u7ba1\u7406\u529f\u80fd\u3002 \u7528\u8fc7Spring  [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[416,979,969,964,1000],"class_list":["post-1270","post","type-post","status-publish","format-standard","hentry","category-java","tag-shiro","tag-shiro-"],"_links":{"self":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/1270","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1270"}],"version-history":[{"count":1,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/1270\/revisions"}],"predecessor-version":[{"id":1271,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/1270\/revisions\/1271"}],"wp:attachment":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1270"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1270"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}