我可以在<sec:authorize />
標籤的訪問屬性中使用通配符。Spring Security通過通配符授權訪問角色
目前我有 <sec:authorize access="hasRole('TICKET_VIEW') or hasRole('TICKET_EDIT')">
,但我希望能夠使用 <sec:authorize access="hasRole('TICKET_*')">
這是可能的,或者沒有人知道一個變通辦法,將完成同樣的事情?
謝謝
我可以在<sec:authorize />
標籤的訪問屬性中使用通配符。Spring Security通過通配符授權訪問角色
目前我有 <sec:authorize access="hasRole('TICKET_VIEW') or hasRole('TICKET_EDIT')">
,但我希望能夠使用 <sec:authorize access="hasRole('TICKET_*')">
這是可能的,或者沒有人知道一個變通辦法,將完成同樣的事情?
謝謝
從Spring 3.x開始,Spring EL是可能的。您正在尋找的表達是hasAnyRole(..)
。
因此,它應該是這樣的:
<sec:authorize access="hasAnyRole('TICKET_VIEW', 'TICKET_EDIT')">
...
</sec:authorize>
下面是一些春節EL表達式的鏈接:我知道這是一個老問題,但這個答案可能有助於未來的搜索 http://static.springsource.org/spring-security/site/docs/3.0.x/reference/el-access.html
。
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的溶液中。