看看AffirmativeBased
- DecisionManager。您可以增強它並向AccessDeniedException
添加一些附加信息。 但它難以從Voter
中得到原因,因爲他們拒絕訪問。 (我希望你會找到一些命名模式,或者你甚至可以擴大選民)。
,這是一個例子,如何配置您的自定義DecisionManager
<security:http auto-config="true" access-decision-manager-ref="myDecisionManager">
<bean id="myAccessDecisionManager"
class="MyAffirmativeBasedDecisionManager">
<constructor-arg name="decisionVoters">
<list>
<ref bean="roleVoter" />
<ref bean="authenticatedVoter" />
<ref bean="preAdviceVoter" />
</list>
</constructor-arg>
</bean>
<bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter" />
<bean id="authenticatedVoter"
class="org.springframework.security.access.vote.AuthenticatedVoter" />
<bean id="preAdviceVoter"
class="org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter">
<constructor-arg ref="exprPreInvocationAdvice" />
</bean>
<bean
class="org.springframework.security.access.expression.method.ExpressionBasedPreInvocationAdvice"
id="exprPreInvocationAdvice">
<property name="expressionHandler" ref="methodExprHandler" />
</bean>
<bean id="methodExprHandler"
class="org.springframework.security.access.expression.method.ExtensibleMethodSecurityExpressionHandler">
<property name="methodSecurityExpressionRootFactory">
<bean
class="com.queomedia.infrastructure.security.spring.MethodSecurityExpressionRootFactoryImpl" />
</property>
</bean>
謝謝!我看到你包括一些其他選民,如preAdviceVoter。如果我使用類似'@PreAuthorize(「hasRole('...')」的方式註釋我的方法,這個選民是否會調用我的自定義RoleVoter? – Flo
@Flo:沒有任何投票者有責任採取自己的決定,所以'@PreAuthorize(「hasRole('...')」)'僅由'PreInvocationAuthorizationAdviceVoter'處理。您的角色投票人將不會參與此決定。 – Ralph
明白了。謝謝 :) – Flo