shiro 패키지 filter ChainDefinitionMap

8867 단어 Shiro
shiro 패키지 filter ChainDefinitionMap
이전 학습 에서 Shiro 를 접 한 Default Filter 는 전체 Shiro 구조 에서 모든 요 구 를 차단 하 는 역할 을 했 습 니 다.Shiro Default Filter 에서 filter Chain Definitions 속성 을 설정 하 였 습 니 다.filter Chain Definitions 의 역할 은 Shiro 에 의 해 차단 되 는 모든 요청 에 대해 설명 하 는 것 입 니 다. 다음은 표준 Default Filter 와 filter Chain Definitions 의 설정 을 보 겠 습 니 다.

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager" />
    <property name="loginUrl" value="/login/toLogin" />
    <property name="successUrl" value="/example/index" />
    <property name="unauthorizedUrl" value="/example/unauthorized" />

    <property name="filterChainDefinitions">
        <value>
            /login/toLogin = anon
            /login/loginVal = anon
            /login/logout = logout

            /example/admin =authc,roles[admin]
            /example/admin =authc,perms[admin:view:*]

            /example/user = authc,roles[user]
            /example/user = authc,perms[user:view:*]

            /** = authc
        value>
    property>
bean>

이상 의 설정 에서 우 리 는 문 제 를 예견 할 수 있 습 니 다. 그것 은 filter Chain Definitions 의 성명 이 너무 많 으 면 이 프로필 이 불필요 하고 비대 해 질 수 있 습 니 다. 이것 은 강박 증 이 있 는 Dev 에 게 매우 고통스러운 고통 이 될 것 입 니 다. 그래서 우 리 는 우아 하고 간결 한 filter Chain Definitions 를 설정 해 야 합 니 다.
공장 디자인 모델 을 통 해 filter Chain DefinitionMap 을 만 드 는 것 을 소개 합 니 다.Shiro 의 소스 코드 에서 filter Chain Definition 자체 가 링크 드 HashMap 이 어야 합 니 다.
  • filterChainDefinition
    public class ShiroFilterFactoryBean implements FactoryBean, BeanPostProcessor {
    
      private static transient final Logger log = LoggerFactory.getLogger(ShiroFilterFactoryBean.class);
    
      private SecurityManager securityManager;
    
      private Map filters;
    
      private Map filterChainDefinitionMap; //urlPathExpression_to_comma-delimited-filter-chain-definition
    
      private String loginUrl;
      private String successUrl;
      private String unauthorizedUrl;
    
      private AbstractShiroFilter instance;
    
      public ShiroFilterFactoryBean() {
          this.filters = new LinkedHashMap();
          this.filterChainDefinitionMap = new LinkedHashMap(); //order matters!
      }
      }
  • filter Chain DefinitionMap
    package com.shiro.example.utils;
    
    import java.util.LinkedHashMap;
    
    public class FilterChainDefinitionMapBuilder {
    
        /**
         *     FilterChainDefinition
         * @return
         */
        public LinkedHashMap buildFilterChainDefinitionMap(){
            LinkedHashMap map = new LinkedHashMap<>();
            //                  
    
            map.put("/login/toLogin", "anon");
            map.put("/login/loginVal", "anon");
            map.put("/login/logout ", "logout");
            map.put("/example/admin", "authc,roles[admin]");
            map.put("/example/admin", "authc,perms[admin:view:*]");
            map.put("/example/user", "authc,roles[user]");
            map.put("/example/user", "authc,perms[user:view:*]");
    
            map.put("/**", "authc");
    
            return map;
        }
    
    }
    사용자 정의
  • 설정 파일 에 FilterChain DefinitionMapBuilder
  • 를 설명 합 니 다.
    <bean id="filterChainDefinitionMapBuilder"     
        class="com.shiro.example.utils.FilterChainDefinitionMapBuilder">bean>
  • 설정 파일 에 filter Chain DefinitionMap
  • 을 설명 합 니 다.
    <bean id="filterChainDefinitionMap" 
            factory-bean="filterChainDefinitionMapBuilder"  
            factorymethod="buildFilterChainDefinitionMap">bean>
  • Default Filter 에서 filter Chain DefinitionMap
    <property name="filterChainDefinitionMap" ref="filterChainDefinitionMap">
        
    property>
  • 작은 매듭
    filter Chain DefinitionMap 을 다시 밀봉 하면 다음 과 같은 이점 을 얻 을 수 있 습 니 다.
  • 프로필 의 여분 감소
  • filter Chain DefinitionMap 을 고도 로 설정 하고 사전 설정 에서 독립 시 켜 단독 설정 이나 배경 설정 을 합 니 다.
  • 좋은 웹페이지 즐겨찾기