2012-10-08 50 views
1

我對Spring安全性非常新,只是通過參考,做了一些示例。我強烈遺漏的一個特徵(我懷疑幾乎沒有其他人似乎錯過了它)是向用戶提供自定義信息爲什麼或爲什麼拒絕訪問。例如。我想告訴用戶他無法訪問模塊A,或者他需要被授予角色訪問權限B等。Spring Security 3 - 爲(角色)選民添加信息

我看了一下角色界面,但是這個信息似乎是迷路:

int vote(Authentication authentication, Object object, List<ConfigAttribute> config); 

Spring Security Access Denied logging with missing role 這是說,我必須提供的自定義實現的AccessDecisionManager

但是,如果訪問被拒絕,實際實現看起來如何提供特定信息?以及如何將其掛鉤到彈簧安全?對於初學者來說,簡單的基於角色的訪問就足夠了。任何人都可以提供這方面的例子嗎?

回答

2

看看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> 
+0

謝謝!我看到你包括一些其他選民,如preAdviceVoter。如果我使用類似'@PreAuthorize(「hasRole('...')」的方式註釋我的方法,這個選民是否會調用我的自定義RoleVoter? – Flo

+0

@Flo:沒有任何投票者有責任採取自己的決定,所以'@PreAuthorize(「hasRole('...')」)'僅由'PreInvocationAuthorizationAdviceVoter'處理。您的角色投票人將不會參與此決定。 – Ralph

+0

明白了。謝謝 :) – Flo

相關問題