2009-06-12 13 views
28

Durante la migrazione di un'applicazione legacy alla primavera di sicurezza ho ottenuto la seguente eccezione:Come utilizzare ruoli/autorità personalizzati in Spring Security?

org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_filterChainProxy': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_filterChainList': Cannot resolve reference to bean '_filterSecurityInterceptor' while setting bean property 'filters' with key [3]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_filterSecurityInterceptor': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Unsupported configuration attributes: [superadmin] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) 
at java.security.AccessController.doPrivileged(Native Method) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) 

Nella vecchia applicazione ci sono ruoli come "superadmin", "editore", "helpdesk", ecc Ma in tutti gli esempi Primavera di sicurezza Vedo solo ruoli come "ROLE_" ("ROLE_ADMIN" ecc.). Quando rinomina "superadmin" a "ROLE_ADMIN" e uso solo questo ruolo nella configurazione, tutto funziona.

non funziona:

<http auto-config="true">          
    <intercept-url pattern="/restricted/**" access="superadmin"/> 
    <form-login 
     authentication-failure-url="/secure/loginAdmin.do?error=true" 
     login-page="/secure/loginAdmin.do" />   
</http> 

Works:

<http auto-config="true">          
    <intercept-url pattern="/restricted/**" access="ROLE_ADMIN"/> 
    <form-login 
     authentication-failure-url="/secure/loginAdmin.do?error=true" 
     login-page="/secure/loginAdmin.do" />   
</http> 

è possibile utilizzare nomi dei ruoli personalizzati?

+0

Questo [domanda] (http://stackoverflow.com/questions/283870/acegi-security-how-do-i-add -un altro-concedere l'autorizzazione all'autenticazione all'anonimo) può aiutare. – kgiannakakis

risposta

39

Si sta utilizzando la configurazione predefinita che prevede che i ruoli inizi con il prefisso "ROLE_". Dovrai aggiungere una configurazione di sicurezza personalizzata e impostare rolePrefix in "";

http://forum.springsource.org/archive/index.php/t-53485.html

+0

posso avere un ROLE_FOO o un ROLE_BAR o un ROLE_ANYTHING_I_WANT? Il collegamento che hai fornito non risolve il problema, è solo un tizio che dice "Impossibile impostare RolePrefix per RoleVoter" –

+6

Sì, puoi avere qualsiasi ruolo tu voglia. Il collegamento mostra un esempio di configurazione e potrebbe non essere di aiuto, ma è stato utile per D. Wroblewski. Se hai bisogno di ulteriore aiuto, inserisci una nuova domanda, molte persone sono pronte a rispondere. – rodrigoap

+0

grazie. mi ha salvato la giornata –

11

Ecco una configurazione completa con espressioni di accesso (link fornito da @rodrigoap sembra un po 'datato):

<http 
     access-decision-manager-ref="accessDecisionManager" 
     use-expressions="true"> 

<beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> 
    <beans:property name="decisionVoters"> 
     <beans:list> 
      <beans:bean class="org.springframework.security.web.access.expression.WebExpressionVoter"/> 
      <beans:bean class="org.springframework.security.access.vote.RoleVoter"> 
       <beans:property name="rolePrefix" value=""/> 
      </beans:bean> 
      <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter"/> 
     </beans:list> 
    </beans:property> 
</beans:bean> 
7

È anche possibile utilizzare sempre l'espressione (da config use-expressions="true") per ignorare il prefisso ROLE_.

Dopo aver letto Primavera di sicurezza 3.1 del codice sorgente, che ho trovato quando use-expressions="true":

Per <security:http >:
HttpConfigurationBuilder#createFilterSecurityInterceptor() si regist WebExpressionVoter ma non RoleVoter, AuthenticatedVoter;

Per <security:global-method-security >: GlobalMethodSecurityBeanDefinitionParser#registerAccessManager() sarà Regist PreInvocationAuthorizationAdviceVoter (condizionale), poi sempre regist RoleVoter, AuthenticatedVoter, regist Jsr250Voter condizionale;

PreInvocationAuthorizationAdviceVoter elaborerà PreInvocationAttribute (PreInvocationExpressionAttribute verrà utilizzato come implementazione) che viene generato in base a @PreAuthorize. PreInvocationExpressionAttribute#getAttribute() restituisce sempre null, quindi RoleVoter, AuthenticatedVoter non votare.

2

Utilizzando Spring Security 3.2, questo ha funzionato per me.

Cambio Prefix Ruolo:

<beans:bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter"> 
    <beans:property name="rolePrefix" value="NEW_PREFIX_"/> 
</beans:bean> 

<beans:bean id="authenticatedVoter" class="org.springframework.security.access.vote.AuthenticatedVoter"/> 

<beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> 
    <beans:constructor-arg > 
     <beans:list> 
      <beans:ref bean="roleVoter"/> 
      <beans:ref bean="authenticatedVoter"/> 
     </beans:list> 
    </beans:constructor-arg> 
</beans:bean> 

A seconda di dove si desidera applicare il prefisso ruolo che essa può essere applicata a livello di schema di sicurezza o il livello di fagioli.

<http access-decision-manager-ref="accessDecisionManager" use-expressions="true"> 

Applicare Prefix Ruolo a livello di servizio:

<beans:bean id="myService" class="com.security.test"> 
    <security:intercept-methods access-decision-manager-ref="accessDecisionManager"> 
     <security:protect access="NEW_PREFIX_ADMIN"/> 
    </security:intercept-methods> 
</beans:bean> 
Problemi correlati