差沙的密碼 -- SSHWSFC's code
          閱讀本Blog請自備塑料袋一只
          posts - 14,  comments - 59,  trackbacks - 0
          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在數據庫里的保存表結構:

          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)
          );
          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。
          posted on 2006-06-17 00:20 差沙 閱讀(2278) 評論(4)  編輯  收藏 所屬分類: avaj

          FeedBack:
          # re: 在Acegi中使用ACL
          2006-07-05 10:48 | acegi
          你好,能不能寫的詳細點,如把你的訂單管理的acl寫出來,謝謝  回復  更多評論
            
          # re: 在Acegi中使用ACL
          2006-07-05 10:49 | acegi
          有點地方不明白,能請教你嗎  回復  更多評論
            
          # re: 在Acegi中使用ACL
          2006-07-18 15:27 | acegi
          想請教個問題,可否  回復  更多評論
            
          # re: 在Acegi中使用ACL[未登錄]
          2008-01-17 14:12 | 白菜
          請問文中的
          ACL_READ指的是這個Voter對哪些SecurityConfig起作用,我們可以把ACL_READ配置在想要攔截的Method上。比方說我們要攔截readOrder這個方法,以實現ACL控制,可以這樣配置。
          orderManager.readOrder=ACL_READ
          orderManager.readOrder=ACL_READ是在哪里配置的?能說的詳細點嗎?  回復  更多評論
            
          這家伙很懶,但起碼還是寫了一句話。

          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿(8)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 江都市| 巴马| 滦南县| 井陉县| 峨眉山市| 固安县| 饶河县| 清流县| 石城县| 卫辉市| 长葛市| 呼伦贝尔市| 石柱| 隆昌县| 舞钢市| 克什克腾旗| 兰溪市| 建德市| 枣强县| 鹤山市| 霍林郭勒市| 宁武县| 平塘县| 台安县| 岳阳市| 平遥县| 江阴市| 洛南县| 新乐市| 仙游县| 昭觉县| 额敏县| 历史| 左权县| 通道| 秦安县| 聂拉木县| 陆良县| 建宁县| 龙岩市| 丰台区|