如何让jsp中的spring安全角色层次结构起作用?

Posted

技术标签:

【中文标题】如何让jsp中的spring安全角色层次结构起作用?【英文标题】:How to get spring security role hierarchy in jsp to work? 【发布时间】:2012-07-11 00:01:40 【问题描述】:

我尝试让角色层次结构在我的应用程序中工作。我唯一想要的是在所有级别上定义的层次结构:在 url 级别,现在也在视图级别(在我的 jsp 文件中)。

我使用以下设置:

     <beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
        <beans:property name="decisionVoters">
            <beans:list>
                <beans:ref bean="roleHierarchyVoter"/>
                <beans:bean class="org.springframework.security.web.access.expression.WebExpressionVoter">
                    <beans:property name="expressionHandler">
                        <beans:bean class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler">
                            <beans:property name="roleHierarchy" ref="roleHierarchy"/>
                        </beans:bean>
                    </beans:property>
                </beans:bean>
                <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter"/>
            </beans:list>
        </beans:property>
    </beans:bean>

    <beans:bean id="roleHierarchyVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter">
        <beans:constructor-arg ref="roleHierarchy"/>
    </beans:bean>

    <beans:bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
        <beans:property name="hierarchy">
            <beans:value>
                ROLE_ADMIN > ROLE_OWNER
                ROLE_OWNER > ROLE_DISTRIBUTOR
                ROLE_DISTRIBUTOR > ROLE_RESELLER
                ROLE_RESELLER > ROLE_USER
            </beans:value>
        </beans:property>
    </beans:bean>

<http auto-config="true" use-expressions="true" access-decision-manager-ref="accessDecisionManager">
    ...
</http>

对于 URL 级别(拦截 URL),它工作得很好,但在我的 jsp 文件中不起作用。问题是我没有正确理解配置以使角色层次结构起作用。

<security:authorize access="hasRole('ROLE_ADMIN')">
    <div class="span4">
        <h2>Admin</h2>
    </div><!--/span-->
</security:authorize>
<security:authorize access="hasRole('ROLE_OWNER')">
    <div class="span4">
        <h2>Owner</h2>
    </div><!--/span-->
</security:authorize>
<security:authorize access="hasRole('ROLE_DISTRIBUTOR')">
    <div class="span4">
        <h2>Distributor</h2>
    </div><!--/span-->
</security:authorize>

我使用这个简单的示例在视图级别测试角色层次结构,但它不起作用。只有拥有 admin 角色的用户可以看到他的区块,其他人看不到。

有人知道我的配置有什么问题。

【问题讨论】:

你有这个问题的答案吗?我也面临同样的问题... 这里回答了 spring 4,thymeleaf 和注释配置:link 【参考方案1】:

我遇到了同样的问题(Spring Security 3.2.5)。

通过在&lt;http&gt; 部分之前声明我的DefaultWebSecurityExpressionHandler 来解决

<!-- This must go before the http element in order to be used by security:authorize tags using the access attribute -->
<!-- https://jira.spring.io/browse/SEC-1452 -->
<beans:bean id="webSecurityExpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler">
    <beans:property name="roleHierarchy" ref="roleHierarchy" />
</beans:bean>

见 https://jira.spring.io/browse/SEC-1452 和 http://forum.spring.io/forum/spring-projects/security/67494-configuration-of-spring-security-3-0m1-expression-handler-bug/page3

【讨论】:

以上是关于如何让jsp中的spring安全角色层次结构起作用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot 的角色层次结构和 OAuth2 安全性

Spring Security 3.2 - 配置全局方法安全性以使用角色层次结构

Spring Security 3.1.4 taglib 授权/身份验证不适用于 Tomcat 7 上 JSF 2.2 中的角色层次结构

如何在 Spring Security 3 和 Spring EL 中使用角色层次结构?

Spring security jsp授权标签不起作用

基于 ROLES 的 Spring 安全授权不起作用