程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring Security 2 中動態角色權限的實現

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

編輯:關於JAVA

安全框架的主體包括兩部分即驗權和授權。Spring Security2可以很好的實 現這兩個過程。Spring Security2對其前身acegi最大的改進是提供了自定義的 配置標簽,通過Security的命名空間定義了http和authentication-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"&g t;
<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>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved