Как заставить работать иерархию ролей безопасности в jsp?
Я пытаюсь заставить иерархии ролей работать в моем приложении. Единственное, что мне нужно, - это определенная иерархия на всех уровнях: на уровне 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>
Я использую этот простой пример для проверки иерархии ролей на уровне представления, но он не работает. Только пользователь с ролью администратора может видеть его блок, но не другие.
Был кто-то идея, что я делаю не так с моей конфигурации.
1 ответ
У меня была такая же проблема (Spring Security 3.2.5).
Решено объявив мой DefaultWebSecurityExpressionHandler
перед <http>
раздел
<!-- 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