Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
          安全框架的主體包括兩部分即驗權和授權。Spring Security2可以很好的實現(xiàn)這兩個過程。Spring Security2對其前身acegi最大的改進是提供了自定義的配置標簽,通過Security的命名空間定義了http和 authentication-provider等標簽,這樣做的好處是極大地簡化了框架的配置,并很好地隱藏了框架實現(xiàn)的細節(jié),在配置的表述上也更清 晰,總體上提高了框架的易用性。

          然而,該框架默認的權限配置方式在xml中,又因為新版本隱藏了實現(xiàn)細節(jié),在動態(tài)權限的擴展上,能力變小了。在驗權過程中,遇到的問題不多。但在 授權時,如果是acegi,人們可以通過繼承AbstractFilterInvocationDefinitionSource類實現(xiàn)在授權(即資源角 色和用戶角色的匹配)前,針對資源的角色的獲取。而新版本因為用新標簽進行了整合,這個過程被默認的類實現(xiàn)隱藏掉了,包括過濾器,資源獲取和角色定義等過 程都由框架來實現(xiàn),于是很多人在使用Spring Security2時也想通過改動DefaultFilterInvocationDefinitionSource對資源的獲取來實現(xiàn)數(shù)據(jù)庫或文件中的 動態(tài)的角色。不過這樣的改動侵入性比較高,而且還保留了acegi的痕跡,也違背了開閉的原則。

          其實,我們完全可以通過Spring Security2 accessManager提供的自定義投票機制來解決這個問題,這樣既不影響現(xiàn)有的基于URL的配置,還可以加入自己的動態(tài)的權限配置。

                   其實現(xiàn)策略如下:

          1 定義類DynamicRoleVoter實現(xiàn)AccessDecisionVoter,注入實現(xiàn)接口DynamicRoleProvider(用來定義獲取角色的方法)的提供動態(tài)角色的類

          2 在兩個supports方法中返回true

          3 在vote方法中,有三個參數(shù)(Authentication authentication, Object object,ConfigAttributeDefinition config) 通過第一個獲取用戶的權限集合,第二個可以獲取到資源對象,進而通過DynamicRoleProvider獲取到角色集合進行匹配。

          4 在配置文件中加入DynamicRoleVoter,如下:

          <beans:bean id="accessDecisionManager" class="org.springframework.security.vote.AffirmativeBased">  
          <beans:property name="decisionVoters">  
          <beans:list>  
          <beans:bean class="org.springframework.security.vote.RoleVoter" />  
          <beans:bean class="org.springframework.security.vote.AuthenticatedVoter" />  
           
          <beans:bean class="DynamicRoleVoter">  
              
          <beans:property name="dynamicRoleProvider">  
                   
          <beans:ref local="dynamicRoleProvider"/>  
           
          </beans:property>  
           
          </beans:bean>  
           
          </beans:list>  
           
          </beans:property>  
           
          </beans:bean>  
           
          <beans:bean id=” dynamicRoleProvider” class=”…”>  
               
          ……  
           </beans:bean
          >  



          http://hszdz.javaeye.com/blog/337652
          posted on 2010-01-11 22:03 seal 閱讀(430) 評論(0)  編輯  收藏 所屬分類: Spring
          主站蜘蛛池模板: 沈丘县| 文登市| 平武县| 家居| 寿宁县| 巫溪县| 黎城县| 诸暨市| 鄂伦春自治旗| 彭泽县| 济宁市| 章丘市| 南乐县| 新竹县| 霍林郭勒市| 固原市| 荆门市| 当涂县| 财经| 延吉市| 景东| 邢台市| 元阳县| 邵阳市| 莱州市| 双鸭山市| 邮箱| 尉氏县| 庆安县| 赤壁市| 砚山县| 邵武市| 平利县| 沙洋县| 成都市| 海晏县| 福州市| 蒙城县| 资中县| 内江市| 锦屏县|