apachhe shiro-ダイナミック作成filterchaindefinitions

4725 ワード

http://www.360doc.com/content/14/0207/13/834950_35045926.shtml
あるシステムでは、データベースを読み込むことによってorg.apache.shiro.spring.web.Shro Filter FactoryBenのfilterChar Definitionsを定義したい場合があります。このように、システムのリンクは、インターフェースを操作したり、バックグラウンドを維持したりすることによって管理することができる。
shrioとspringが統合された後、ソースを調整する上級者はすでに気づいているかもしれません。プロジェクト開始時に、shrioは自分のorg.apache.shiro.spring.web.Shro Filter FactoryBen類のfilterChar Definitions属性を一つのfilterChanDefinitionMapに変換し、変換が完了したらShroFilter FactoryBernに保管します。ShroFilter FactoryBenは、どのリンクがアクセスできますか?filterChanDefinitionMapの中のキーはリンクURLです。値はどのような条件があればこのリンクにアクセスできますか?filter ChanDefinitionMapはMapで、shiroはMapのサブクラスIni.Sectionを拡張します。
現在は、テーブルの記述エンティティクラスとデータアクセスがあります。
@Entity
@Table(name="TB_RESOURCE")
public class Resource implements Serializable {
    //  id
    @Id
    private String id;
    //action url
    private String value;
    //shiro permission;
    private String permission;
    //------------------Getter/Setter---------------------//
}


@Repository
public class ResourceDao extends BasicHibernateDao<Resource, String> {

}
このクラスを通して、permissionフィールドとvalueがfilterChanDefinitionMapのキー/値であることが分かります。spring FactoryBenインターフェースでgetObject()を返してfilter ChanDefinitionMapに返せばいいです。
public class ChainDefinitionSectionMetaSource implements FactoryBean<Ini.Section>{

    @Autowired
    private ResourceDao resourceDao;
    
    private String filterChainDefinitions;
    
    /**
     *   premission   
     */
    public static final String PREMISSION_STRING="perms[\"{0}\"]";
    
    
    public Section getObject() throws BeansException {
        
        //    Resource
        List list = resourceDao.getAll();
        
        Ini ini = new Ini();
        //     url
        ini.load(filterChainDefinitions);
        Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
        //  Resource url,     section 。section  filterChainDefinitionMap,
        //        URL,                
        for (Iterator it = list.iterator(); it.hasNext();) {
            
            Resource resource = it.next();
            //         section 
            if(StringUtils.isNotEmpty(resource.getValue()) && StringUtils.isNotEmpty(resource.getPermission())) {
                section.put(resource.getValue(),  MessageFormat.format(PREMISSION_STRING,resource.getPermission()));
            }
            
        }
        
        return section;
    }
    
    /**
     *   filterChainDefinitions    url    
     * 
     * @param filterChainDefinitions    url    
     */
    public void setFilterChainDefinitions(String filterChainDefinitions) {
        this.filterChainDefinitions = filterChainDefinitions;
    }


    
    public Class> getObjectType() {
        return this.getClass();
    }


    
    public boolean isSingleton() {
        return false;
    }
    
}
chainDefinitionSectionation MetaSourceを定義してappliation Controt-shiro.xmlファイルを修正します。
<bean id="chainDefinitionSectionMetaSource" class="org.exitsoft.showcase.vcsadmin.service.account.ChainDefinitionSectionMetaSource">
    
    <property name="filterChainDefinitions">
        <value>
            /login = authc
            /logout = logout
            /resource/** = anon
        </value>
    </property>
</bean>


<bean id="shiroSecurityFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager" />
    <property name="loginUrl" value="/login.jsp" />
    <property name="successUrl" value="/index.jsp" />
    <property name="unauthorizedUrl" value="/unauthorized.jsp" />
    <!-- shiro      ,                 --&gt
    <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />
</bean>

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
</bean>

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>