<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Junky's IT Notebook

    統計

    留言簿(8)

    積分與排名

    WebSphere Studio

    閱讀排行榜

    評論排行榜

    Acegi安全系統擴展 ----- Acegi ACL使用

    4.1 基本概念

           在google中搜索'acl'會找到很多相關的介紹,而且涉及的范圍也特別廣泛。ACL是(Access Control List)的縮寫,顧名思義,ACL是‘訪問控制列表’的意思。通俗點說,ACL保存了所有用戶或角色對資源的訪問權限。最典型的ACL實現是流行操作系統(window, unix)的文件訪問控制系統,精確定義了某個用戶或角色對某個特定文件的讀、寫、執行等權限,更通俗的例子是可以定義某個管理員只能管一部分的訂單,而另一個管理員只能管另一部分的。

    4.2 Acegi ACL配置

    Acegi好早就實現了ACL(好像是0.5),但是使用起來確實有點麻煩,所以用的不是太廣泛。這里簡單的說明一下使用方法,希望有更多的朋友來試試。

    首先要理解Acegi里面Voter的概念,ACL正是在一個Voter上擴展起來的。現來看一下AclVoter的配置。

        <bean id="aclBeanReadVoter" class="org.acegisecurity.vote.BasicAclEntryVoter">
            
    <property name="processConfigAttribute">
                
    <value>ACL_READ</value>
            
    </property>
            
    <property name="processDomainObjectClass">
                
    <value>org.springside.modules.security.acl.domain.AclDomainAware</value>
            
    </property>
            
    <property name="aclManager">
                
    <ref local="aclManager"/>
            
    </property>
            
    <property name="requirePermission">
                
    <list>
                    
    <ref local="org.acegisecurity.acl.basic.SimpleAclEntry.ADMINISTRATION"/>
                    
    <ref local="org.acegisecurity.acl.basic.SimpleAclEntry.READ"/>
                
    </list>
            
    </property>
        
    </bean>
    1. ACL_READ指的是這個Voter對哪些SecurityConfig起作用,我們可以把ACL_READ配置在想要攔截的Method上。比方說我們要攔截readOrder這個方法,以實現ACL控制,可以這樣配置。
      orderManager.readOrder=ACL_READ
    2. processDomainObjectClass指出哪些DomainObject是要進行ACL校驗的。
    3. aclManager是一個比較重要的概念,主要負責在權限列表中根據用戶和DomainObject取得acl列表。
    4. requirePermission指出要進行這個操作必須具備的acl權限,比方說read操作就必須有ADMINISTRATION或READ兩個權限。

    其實整個過程看下來比較清晰,下面來看一下AclManager如何配置。

        <!-- ========= ACCESS CONTROL LIST LOOKUP MANAGER DEFINITIONS ========= -->

        
    <bean id="aclManager" class="org.acegisecurity.acl.AclProviderManager">
            
    <property name="providers">
                
    <list>
                    
    <ref local="basicAclProvider"/>
                
    </list>
            
    </property>
        
    </bean>

        
    <bean id="basicAclProvider" class="org.acegisecurity.acl.basic.BasicAclProvider">
            
    <property name="basicAclDao">
                
    <ref local="basicAclExtendedDao"/>
            
    </property>
        
    </bean>

        
    <bean id="basicAclExtendedDao" class="org.acegisecurity.acl.basic.jdbc.JdbcExtendedDaoImpl">
            
    <property name="dataSource">
                
    <ref bean="dataSource"/>
            
    </property>
        
    </bean>


    很明顯ACLManager繼承了Acegi的一貫風格,Provider可以提供多種取得ACL訪問列表的途徑,默認的是用basicAclProvider在數據庫中取得。既然提到了數據庫,那我們就來看一下Acegi默認提供的ACL在數據庫里的保存表結構:

    1. acl_object_identity表存放了所有受保護的domainObject的信息。其中object_identity字段保存了domainObject的class和id,默認的保存格式是:domainClass:domainObjectId。
    2. acl_permission 就是ACL權限列表了,recipient 是用戶或角色信息,mask表示了這個用戶或角色對這個domainObject的訪問權限。注意這些信息的保存格式都是可以根據自己的需要改變的。

    這樣讀取和刪除的時候Acegi就能很好的完成攔截工作,但是讀取一個List的時候,如何才能把該用戶不能操作的domainObject剔除掉呢?這就需要afterInvocationManager來完成這個工作。下面來看下配置:

        <!-- ============== "AFTER INTERCEPTION" AUTHORIZATION DEFINITIONS =========== -->

        
    <bean id="afterInvocationManager" class="org.acegisecurity.afterinvocation.AfterInvocationProviderManager">
            
    <property name="providers">
                
    <list>
                    
    <ref local="afterAclCollectionRead"/>
                
    </list>
            
    </property>
        
    </bean>
        
    <!-- Processes AFTER_ACL_COLLECTION_READ configuration settings -->
        
    <bean id="afterAclCollectionRead" class="org.acegisecurity.afterinvocation.BasicAclEntryAfterInvocationCollectionFilteringProvider">
            
    <property name="aclManager">
                
    <ref local="aclManager"/>
            
    </property>
            
    <property name="requirePermission">
                
    <list>
                    
    <ref local="org.acegisecurity.acl.basic.SimpleAclEntry.ADMINISTRATION"/>
                    
    <ref local="org.acegisecurity.acl.basic.SimpleAclEntry.READ"/>
                
    </list>
            
    </property>
        
    </bean>


    afterAclCollectionRead會在攔截的方法執行結束的時候執行。主要的作用就是在返回的List中挨個檢查domainObject的操作權限,然后根據requirePermission來剔除不符合的domainObject。

    4.3 使用RuleEngine設置的ACL規則

    在SpringSide里使用了RuleEngine來設置ACL規則,具體規則見
    bookstore-sample\resources\rules\drl

     

    CREATE TABLE acl_object_identity (
    id
    IDENTITY NOT NULL,
    object_identity VARCHAR_IGNORECASE(
    250) NOT NULL,
    parent_object
    INTEGER,
    acl_class VARCHAR_IGNORECASE(
    250) NOT NULL,
    CONSTRAINT unique_object_identity UNIQUE(object_identity),
    FOREIGN KEY (parent_object) REFERENCES acl_object_identity(id)
    );
    CREATE TABLE acl_permission (
    id
    IDENTITY NOT NULL,
    acl_object_identity
    INTEGER NOT NULL,
    recipient VARCHAR_IGNORECASE(
    100) NOT NULL,
    mask
    INTEGER NOT NULL,
    CONSTRAINT unique_recipient UNIQUE(acl_object_identity, recipient),
    FOREIGN KEY (acl_object_identity) REFERENCES acl_object_identity(id)
    );

    posted on 2007-06-27 15:13 junky 閱讀(462) 評論(0)  編輯  收藏 所屬分類: security

    主站蜘蛛池模板: 97超高清在线观看免费视频| 一级免费黄色大片| 91短视频免费在线观看| 亚洲国产精品久久久天堂| a毛片久久免费观看| 亚洲无人区一区二区三区| 国产性生大片免费观看性| 亚洲精品国偷自产在线| 免费人成毛片动漫在线播放| 亚洲真人无码永久在线| 拍拍拍无挡视频免费观看1000| 亚洲精品乱码久久久久久久久久久久| 国产一精品一av一免费爽爽| 亚洲综合国产精品| 四虎在线免费视频| 亚洲AV女人18毛片水真多| 亚洲精品无码你懂的网站| 美女被免费网站91色| 亚洲成a人片在线观看无码专区| 久久国产乱子伦精品免费不卡| 亚洲精品美女久久久久9999| 成年性午夜免费视频网站不卡| 亚洲国产精品无码久久久秋霞1| 一本色道久久88综合亚洲精品高清| 男女一边摸一边做爽的免费视频| 亚洲精品无码不卡| 处破痛哭A√18成年片免费| 曰批免费视频播放免费| 亚洲精品蜜桃久久久久久| 四虎免费影院ww4164h| 美女羞羞喷液视频免费| 亚洲AV午夜成人影院老师机影院| 99re6热视频精品免费观看| 亚洲区日韩精品中文字幕| 亚洲无线一二三四区手机| 人妻无码久久一区二区三区免费| 亚洲欧洲日本在线观看| 亚洲区小说区图片区| 日本免费大黄在线观看| 黄页网站在线视频免费| 亚洲黄色免费电影|