2011-09-07 376 views
3

我可以在<sec:authorize />標籤的訪問屬性中使用通配符。Spring Security通過通配符授權訪問角色

目前我有 <sec:authorize access="hasRole('TICKET_VIEW') or hasRole('TICKET_EDIT')">

,但我希望能夠使用 <sec:authorize access="hasRole('TICKET_*')">

這是可能的,或者沒有人知道一個變通辦法,將完成同樣的事情?

謝謝

回答

3

1)允許來自固定集合的單一角色:這是簡單的基本情況。

<security:authorize access="hasRole('ROLE_ADMIN_ABC')"> 
    You are allowed to see these admin links. 
</security:authorize> 

2)允許從一組固定任何角色:對於您要允許「與ADMIN開頭的角色」的情況下,你知道所有的角色名的提前,而你只是有一個幾個角色,jzelenkov的答案是完全正確的。但是,如果您要處理的角色太多,您可能需要創建一個自定義方法調用,以便進行訪問決策,並使用SpEL將其插入到訪問屬性中。這個解決方案更接近最初提出的通配符問題。

<bean id="mySecurityBean" class="com.sample.MySecurityBean" /> 

<security:authorize access="@mySecurityBean.roleStartsWith(principal, 'ROLE_ADMIN_')"> 
    You are allowed to see these admin links. 
</security:authorize> 

public class MySecurityBean { 
    /** 
    * Returns true if any role starts with some prefix. 
    */ 
    public boolean roleStartsWith(UserDetails user, String rolePrefix) { 
     for (GrantedAuthority auth : user.getAuthorities()) { 
      if (auth.getAuthority().startsWith(rolePrefix) 
       return (true); 
     } 
     return (false); 
    } 
} 

3)允許從單個角色的一組動態:對於您要允許「與ADMIN啓動特定的角色」,但你不一定知道所有的角色允許後綴的情況下,您可以在呈現時使用JSTL插入角色名稱。作爲一個例子,考慮一個包含許多工作空間的應用程序,每個工作空間都有唯一的代碼您想爲每個工作區創建一個ROLE_ADMIN_workspaceName角色。當有人訪問ABC工作區頁面時,如果用戶具有ROLE_ADMIN_ABC角色,則只需要顯示管理鏈接。讓我們假設每個工作空間都使用相同的JSP視圖,並且名稱作爲$ {workspaceName}傳遞到模型中。

<sec:authorize access="hasRole('ROLE_ADMIN_${workspaceName}')"> 
    You are allowed to see these admin links. 
</sec:authorize> 

4)允許從一組動態不限角色:這等同於對於#2的溶液中。