狂奔 lion

          自強(qiáng)不息

          Spring Security 2 中動(dòng)態(tài)角色權(quán)限的實(shí)現(xiàn)

           

          安全框架的主體包括兩部分即驗(yàn)權(quán)和授權(quán)。Spring Security2可以很好的實(shí)現(xiàn)這兩個(gè)過程。Spring Security2對(duì)其前身acegi最大的改進(jìn)是提供了自定義的配置標(biāo)簽,通過Security的命名空間定義了httpauthentication-provider等標(biāo)簽,這樣做的好處是極大地簡(jiǎn)化了框架的配置,并很好地隱藏了框架實(shí)現(xiàn)的細(xì)節(jié),在配置的表述上也更清晰,總體上提高了框架的易用性。

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

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

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

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

          2 在兩個(gè)supports方法中返回true

          3 vote方法中,有三個(gè)參數(shù)(Authentication authentication, Object object,

          ConfigAttributeDefinition config) 通過第一個(gè)獲取用戶的權(quán)限集合,第二個(gè)可以獲取到資源對(duì)象,進(jìn)而通過DynamicRoleProvider獲取到角色集合進(jìn)行匹配。

          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 楊一. 版權(quán)所有. 保留所有權(quán)利

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

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

          導(dǎo)航

          公告

          本人在blogjava上發(fā)表的文章及隨筆除特別聲明外均為原創(chuàng)或翻譯,作品受知識(shí)產(chǎn)權(quán)法保護(hù)并被授權(quán)遵從 知識(shí)分享協(xié)議:署名-非商業(yè)性使用-相同方式共享 歡迎轉(zhuǎn)載,請(qǐng)?jiān)谵D(zhuǎn)載時(shí)注明作者姓名(楊一)及出處(www.aygfsteel.com/yangyi)
          /////////////////////////////////////////
          我的訪問者

          常用鏈接

          留言簿(5)

          隨筆分類(55)

          隨筆檔案(55)

          相冊(cè)

          Java

          其他技術(shù)

          生活

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          自強(qiáng)不息


          用心 - 珍惜時(shí)間,勇于創(chuàng)造
          主站蜘蛛池模板: 蒙山县| 文昌市| 钟山县| 玉龙| 五原县| 米林县| 阳曲县| 开江县| 沽源县| 汕头市| 巴彦淖尔市| 龙州县| 台中市| 黑山县| 青浦区| 天长市| 红安县| 新丰县| 广宁县| 内乡县| 阿城市| 东乌| 宁南县| 休宁县| 科技| 旺苍县| 永和县| 吐鲁番市| 田东县| 仪征市| 九寨沟县| 祁东县| 滦平县| 蓝山县| 井陉县| 开封县| 渝中区| 于田县| 且末县| 牙克石市| 连江县|