狂奔 lion

          自強不息

          Spring Security 2 中動態角色權限的實現

           

          安全框架的主體包括兩部分即驗權和授權。Spring Security2可以很好的實現這兩個過程。Spring Security2對其前身acegi最大的改進是提供了自定義的配置標簽,通過Security的命名空間定義了httpauthentication-provider等標簽,這樣做的好處是極大地簡化了框架的配置,并很好地隱藏了框架實現的細節,在配置的表述上也更清晰,總體上提高了框架的易用性。

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

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

                   其實現策略如下:

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

          2 在兩個supports方法中返回true

          3 vote方法中,有三個參數(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
          >


           @2008 楊一. 版權所有. 保留所有權利

          posted on 2009-03-04 12:55 楊一 閱讀(5079) 評論(0)  編輯  收藏 所屬分類: HLD

          <2009年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          公告

          本人在blogjava上發表的文章及隨筆除特別聲明外均為原創或翻譯,作品受知識產權法保護并被授權遵從 知識分享協議:署名-非商業性使用-相同方式共享 歡迎轉載,請在轉載時注明作者姓名(楊一)及出處(www.aygfsteel.com/yangyi)
          /////////////////////////////////////////
          我的訪問者

          常用鏈接

          留言簿(5)

          隨筆分類(55)

          隨筆檔案(55)

          相冊

          Java

          其他技術

          生活

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          自強不息


          用心 - 珍惜時間,勇于創造
          主站蜘蛛池模板: 安化县| 关岭| 清水县| 浪卡子县| 盘锦市| 德令哈市| 正宁县| 崇礼县| 灵寿县| 石阡县| 会东县| 盈江县| 禹州市| 安国市| 怀安县| 巍山| 宁陵县| 丰宁| 中牟县| 滨海县| 日土县| 庄河市| 方城县| 定安县| 工布江达县| 策勒县| 屯留县| 桦川县| 胶州市| 曲阜市| 嵩明县| 扎囊县| 伊宁市| 贡嘎县| 合江县| 铜梁县| 商城县| 崇明县| 两当县| 安陆市| 新河县|