Spring security Spring Security使用通配符授权访问角色

Spring security Spring Security使用通配符授权访问角色,spring-security,Spring Security,我是否可以在标记的访问属性中使用通配符 目前我有 但我希望能够使用 这是可能的,还是有人知道一个可以完成同样事情的解决方案 谢谢从Spring 3.x开始,在Spring EL中这是可能的。您要查找的表达式是hasAnyRole(..) 所以它应该是这样的: ... 以下是有关更多Spring EL表达式的链接: 我意识到这是一个老问题,但这个答案可能对未来的搜索者有所帮助 1) 允许来自固定集合的单个角色:这是简单的基本情况 <security:authorize access=

我是否可以在
标记的访问属性中使用通配符

目前我有

但我希望能够使用

这是可能的,还是有人知道一个可以完成同样事情的解决方案


谢谢

从Spring 3.x开始,在Spring EL中这是可能的。您要查找的表达式是
hasAnyRole(..)

所以它应该是这样的:


...
以下是有关更多Spring EL表达式的链接:

我意识到这是一个老问题,但这个答案可能对未来的搜索者有所帮助

1) 允许来自固定集合的单个角色:这是简单的基本情况

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

您可以查看这些管理员链接。
2) 允许固定集合中的任何角色:对于希望允许“以ADMIN开头的任何角色”的情况,您事先知道所有角色名称,并且只有几个角色,jzelenkov的回答完全正确。但是,如果要处理的角色太多,则可能需要创建一个可以做出访问决策的自定义方法调用,并使用SpEL将其插入到access属性中。此解决方案更接近最初提出的通配符问题

<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);
    }
}

您可以查看这些管理员链接。
公共类MySecurityBean{
/**
*如果任何角色以某个前缀开头,则返回true。
*/
公共布尔roleStartsWith(UserDetails用户,字符串rolePrefix){
for(GrantedAuthority:user.getAuthories()){
if(auth.getAuthority().startsWith(rolePrefix)
返回(真);
}
返回(假);
}
}
3) 允许动态集中的单个角色:对于希望允许“以ADMIN开头的特定角色”,但不一定知道所有允许的角色后缀的情况,可以在呈现时使用JSTL插入角色名称。举个例子,考虑一个有很多工作空间的应用程序,每个都有唯一的代码。您希望为每个工作区创建一个角色\管理员\工作空间名称角色。当有人访问ABC工作区页面时,您只希望在用户具有角色\u admin\u ABC角色时显示管理员链接。让我们假设每个工作区使用相同的JSP视图,并且名称作为${workspaceName}传递到模型中

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

您可以查看这些管理员链接。
4) 允许动态集合中的任何角色:这与#2的解决方案相同