2013-07-29 50 views
2

我在我的應用程序中的角色約定機制,每個角色如下語法:在春季安全角色使用通配符

APP_DEPARTMENT1_USER 
APP_DEPARTMENT1_AUDITOR 
APP_DEPARTMENT1_WHATEVER 
APP_DEPARTMENT2_... 

我想爲了讓符合給定後綴的所有角色配置Spring安全被授予訪問我的Web應用程序的一部分。我一味地嘗試<intercept-url pattern="/secure/audit/**" access="APP_*_AUDITOR,APP_ADMINISTRATOR" />(其中APP_ADMINISTRATOR是我的默認管理員角色),但它不起作用。當我以管理員身份登錄時,我可以訪問該頁面,但是當我嘗試使用APP_DEPARTMENT1_AUDITOR配置文件登錄時,我無法訪問該頁面。

我認爲通配符表達式不被支持,我不相信Spring EL表達式可以提供幫助(或者我沒有足夠的掌握它們)。

有沒有什麼辦法可以在<intercept-url>標籤內配置Spring Security的角色模式?

回答

2

一個解決方案可能是使用Spring Security對role hierarchies的內置支持,並指定一個通用的APP_AUDITOR角色,它包含各個部門的審計員角色。

另一種方法是創建您自己的可以使用模式的改進角色投票人,因爲現有實現只執行simple equality test。基於這個現有的類,應該很容易做一些模式匹配。一旦你在的地方,你可以用這種方式連線了安全基礎設施的定製選民:

<http access-decision-manager-ref="myAccessDecisionManager"> 
    ... 
</http> 

<bean id="myAccessDecisionManager" 
    class="org.springframework.security.access.vote.AffirmativeBased"> 
    <constructor-arg name="decisionVoters"> 
     <list> 
     <bean id="patternBasedRoleVoter" 
      class="com.example.PatternBasedRoleVoter"/> 
     <bean id="authenticatedVoter" 
      class="org.springframework.security.access.vote.AuthenticatedVoter"/>    
     </list> 
    </constructor-arg> 
</bean> 
+0

我的應用程序目前沒有實現任何形式的角色層次結構,但答案值得+1以備將來考慮 –

+0

用替代方案更新了我的答案。 – zagyi

2

作爲一個選項,您可以將您的conf使用Web安全表達式,然後介紹了自定義的Web安全表達式將能夠處理正則表達式輸入。切換到安全的表達式:

<http use-expressions="true"> 
    <intercept-url pattern="/secure/audit/**" access=" 
     hasRole('APP_DEPARTMENT1_AUDITOR') 
     and hasRole('APP_DEPARTMENT2_AUDITOR') 
     or hasRole('APP_ADMINISTRATOR')" /> 

介紹您的自定義hasRegexRole('regex_input')網絡安全表達described here

<http use-expressions="true"> 
    <intercept-url pattern="/secure/audit/**" access=" 
     hasRegexRole('APP_*_AUDITOR') 
     or hasRole('APP_ADMINISTRATOR')" /> 

可以使用org.springframework.security.access.expression.SecurityExpressionRoot.hasRole(String role)方法的源代碼,看看如何可以得到當局。然後你需要應用正則表達式模式匹配,這就是全部。希望這可以幫助。