アプリケーションで役割階層を機能させるようにしています。私が欲しいのは、すべてのレベルで定義された階層です。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>
この簡単な例を使用して、ビューレベルで役割階層をテストしますが、機能しません。管理者ロールを持つユーザーのみが自分のブロックを表示でき、他のユーザーは表示できません。
私が自分の設定で何が間違っているのかを誰かに知ってもらいました。