七、Shiroフィルター

8664 ワード

一、内蔵フィルター
(一)内蔵フィルタの紹介
  • roles[a,b,c]は、
  • にアクセスするには、ロールが一致する必要があります.
  • perms[a,b]は、
  • にアクセスするには、すべての権限を持つ必要があります.
  • port[a,b]、アクセスできるポートを指定する必要があります!!
  • ####################################
  • anno:
  • へのアクセス権限なし
  • authc:
  • にアクセスするには認証が必要です.
  • user:
  • にアクセスするには、ユーザー・オブジェクトが存在する必要があります.
  • logoutログインが終了するまで
  • にアクセスできません.
    (二)内蔵フィルタテスト
    
        <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
            
            <property name="securityManager" ref="securityManager"/>
            
            <property name="loginUrl" value="login.html"/>
            
            <property name="unauthorizedUrl" value="403.html"/>
            
            <property name="filterChainDefinitions">
                <value>
                    /login.html = anon
                    /sublogin = anon
                    
                    /testRole = roles[admin]
                    /testRole1 = roles[admin,user]
                    
                    /testPermission = perms[user:delete]
                    /testPermission1 = perms[user:delete,user:add]
    
                    /* = authc
                value>
            property>
        bean>

    二、カスタムフィルタ  内蔵フィルタの欠点:例えば/testRole1 = roles[admin,user]admin,userロールを同時に持たなければ/testRole1ロールにアクセスできないことを示しているが、そのうちの1つのロールさえあればアクセスできる必要がある場合がある.このような需要内蔵フィルタは満足できないため、カスタムフィルタが必要である.
     カスタム認証に関連するフィルタであれば、AuthenticationFilterを継承する必要がある.カスタムライセンス関連フィルタの場合は、AuthorizationFilterを継承する必要があります.
    ここでは、ロールの1つさえあればアクセスできるようにする例で、カスタムフィルタの説明を行います.
    (一)カスタムフィルタRolesOrFilterの作成
    /**
     * @author   
     * @date 2018/9/8 22:18
     * RolesOrFilter  :                ,      
     */
    public class RolesOrFilter extends AuthorizationFilter {
        @Override
        protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
            //        Subject  
            Subject subject = getSubject(servletRequest, servletResponse);
            /**
             *              "shiroFilter"         ,             :
             * 
             *         ,             ,  “/testRole1 = rolesOr[admin,user]”,
             *     Object    admin,user    。
             */
            String[] roles = (String[]) o;
    
            if (roles != null && roles.length != 0){
                for (String role : roles){
                    //            
                    if (subject.hasRole(role)){
                        return true;
                    }
                }
            }
            return false;
        }
    }

    (二)カスタムフィルタの構成
    
        <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
            
            <property name="securityManager" ref="securityManager"/>
            
            <property name="loginUrl" value="login.html"/>
            
            <property name="unauthorizedUrl" value="403.html"/>
            
            <property name="filterChainDefinitions">
                <value>
                    /login.html = anon
                    /sublogin = anon
                    /testRole = roles[admin,user]
    
                    /testRole1 = rolesOr[admin,user]
    
                    /testPermission = perms[user:delete]
                    /testPermission1 = perms[user:delete,user:add]
                    /* = authc
                value>
            property>
            
            <property name="filters">
                <util:map>
                    <entry key="rolesOr" value-ref="rolesOrFilter"/>
                util:map>
            property>
        bean>
        
        <bean id="rolesOrFilter" class="org.pc.filter.RolesOrFilter"/>