posts - 193,  comments - 520,  trackbacks - 0

          數(shù)據(jù)權限分為兩種,一種是數(shù)據(jù)范圍權限,一種是具體到每一條數(shù)據(jù)的權限。前一種可以通過動態(tài)構建SQL解決;后一種
          似乎必須通過ACL不可。于是就想對Acegi ACL做一個通用的擴展。以通訊錄為例
          先看一個總的配置
          ? <bean id="contactManagerSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
          ????? <property name="authenticationManager"><ref bean="authenticationManager"/></property>
          ????? <property name="accessDecisionManager"><ref local="aclDecisionManager"/></property>
          ????? <property name="afterInvocationManager"><ref local="afterInvocationManager"/></property>
          ????? <property name="objectDefinitionSource">
          ???????? <value>
          ??????????? com.ronghao.acltest.services.ContactService.saveContact=AFTER_ACL_CREAT
          ??????????? com.ronghao.acltest.services.ContactService.getAllContacts=AFTER_ACL_COLLECTION_READ
          ??????????? com.ronghao.acltest.services.ContactService.getContact=AFTER_ACL_READ
          ???????? </value>
          ????? </property>
          ?? </bean>
          擴展一、當你增加一條記錄的同時向ACL表里插入權限信息 這個SS已經(jīng)做到了這一點
          ??ss有一個接口標示哪些doamin需要acl保護 AclDomainAware
          ??這里再擴展一個基類 ,目的很簡單當讀出數(shù)據(jù)時附加上權限信息
          ??public? class BasicAclDomain implements AclDomainAware {

          ??? private int mask; //權限

          ??? public int getMask() {
          ??????? return mask;
          ??? }

          ??? public void setMask(int mask) {
          ??????? this.mask = mask;
          ??? }
          ??}
          ??
          ??public class Contact extends BasicAclDomain
          擴展二、讀取列表時進行數(shù)據(jù)的過濾,原來的acegi在ACL的集合后處理會造成分頁產(chǎn)生虎牙子
          ???? 這里采用前攔截,在acl表里增加一個className字段,里面放上PO的類名,這樣可以縮小
          ???? 數(shù)據(jù)查詢范圍.實際在讀取集合時,是先到acl表里完成分頁,然后獲得對Contact的real id list
          ???? 然后攔截實際DAO方法,動態(tài)改變SQL成select * from real_data where id in ( {real id list} )的形式,這樣就OK了,
          ???? 分頁實際是對acl表里相應記錄的'分頁'.比如說取第10條到20條,實際是取acl表里相應記錄的第10條到20條來動態(tài)改變SQL
          ???? 這個可以寫一個專門被用來攔截的類 SecurityDAO 方法findByPageACL(query, page),ContactServiceImpl中getAllContacts
          ???? 方法強制調用該方法
          擴展三、后攔截。這里AFTER_ACL_COLLECTION_READ和AFTER_ACL_READ的目的就很簡單了,因為他們不再進行數(shù)據(jù)過 濾,?他們只是把用戶對每條記錄的mask取最大權限就OK,然后往PO里setMask。這樣PO帶了權限信息到頁面上就非常好處理了。比如button的顯示等等
          擴展四、封裝AclService,對單條記錄的ACL權限管理。比如增加權限、修改權限、刪除權限。這個acegi的最新1.0.3已經(jīng)開始加入。
          具體在實現(xiàn)中感覺acl的vote完全是雞肋,全部不用。另外在擴展二中如果用戶數(shù)據(jù)要實現(xiàn)數(shù)據(jù)庫排序就比較困難。所以就有了還未實現(xiàn)的構想:
          一、PO創(chuàng)建向ACL表里插入權限信息時可以配置不同的策略:比如通訊錄創(chuàng)建一條新信息只能創(chuàng)建者可以看并管理,而你往請假表里插一條新信息后,不僅你了,你的上司也可以同時看到。(這個還是比較easy)
          二、用戶數(shù)據(jù)要實現(xiàn)數(shù)據(jù)庫排序。需要在ACL_OBJECT_IDENTITY里增加幾個額外的字段,把po相應的排序字段同步更新到ACL表中。什么?不好做?寫配置文件啊!再對PO的update進行后攔截。
          想法就這樣。實現(xiàn)??



          http://www.aygfsteel.com/ronghao 榮浩原創(chuàng),轉載請注明出處:)
          posted on 2006-12-14 10:20 ronghao 閱讀(4281) 評論(6)  編輯  收藏 所屬分類: 權限相關

          FeedBack:
          # re: 對Acegi ACL擴展的構想
          2006-12-15 10:29 | 差沙
          寫的不錯,有幾個疑問
          為什么ACL的Voter是雞肋呢,ACL完全是再一個Voter上發(fā)展起來的。

          你說的構想一,其實自己寫一個ACL規(guī)則就能實現(xiàn),總體來說ACL這邊還是加上腳本引擎(當然要考慮性能問題)是最靈活的解決方案。

          還有你說的SQL層實現(xiàn)ACL攔截,前一陣子好像有人在做。  回復  更多評論
            
          # re: 對Acegi ACL擴展的構想
          2006-12-16 11:55 | ronghao
          純粹是個人看法,覺得ACL似乎并不需要acegi的前攔截,于是VOTE就作用不太大,另外是把mask給附加到PO的屬性里,這樣就更加覺得不需要了.
          關于構想一,我們可以針對不同的需求配置不同的AFTER_ACL_CREAT
          比如:AFTER_CONTACT_ACL_CREATE
          AFTER_MESSAGE_ACL_CREATE
          SQL層實現(xiàn)ACL攔截我已經(jīng)有了一個粗糙的實現(xiàn),就是有限制:即getAll時SQL必須是select * from table 后面不能帶條件,原因也很簡單:ACL表里沒有業(yè)務字段.所以這也是我著重考慮的問題:)  回復  更多評論
            
          # re: 對Acegi ACL擴展的構想
          2008-01-04 15:13 | 企業(yè)精英社區(qū)
          文中提到的ss是指什么呢?  回復  更多評論
            
          # re: 對Acegi ACL擴展的構想
          2008-01-17 15:17 | ronghao
          springside  回復  更多評論
            
          # re: 對Acegi ACL擴展的構想
          2008-03-20 17:40 | zhx

          因為是剛接觸,所以我想問下,是不是每個領域對象的實例在acl表里都要體現(xiàn)。如果要保護的領域對象多了的話 那么acl表里的數(shù)據(jù)量是不是會很大?  回復  更多評論
            
          # re: 對Acegi ACL擴展的構想
          2008-04-07 18:19 | ronghao
          @zhx
          是的,所以需要權衡。  回復  更多評論
            
          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          關注工作流和企業(yè)業(yè)務流程改進。現(xiàn)就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

          常用鏈接

          留言簿(38)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          常去的網(wǎng)站

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 安塞县| 沂源县| 绿春县| 乳山市| 淅川县| 遂川县| 永清县| 雷州市| 平和县| 西贡区| 周口市| 屯昌县| 手游| 无为县| 西充县| 阳高县| 连江县| 垦利县| 济阳县| 诏安县| 定远县| 万山特区| 永年县| 祁门县| 余江县| 盖州市| 克拉玛依市| 陵水| 连山| 大同县| 墨竹工卡县| 永济市| 宕昌县| 濮阳县| 诸城市| 静乐县| 益阳市| 隆林| 营口市| 上林县| 扬中市|