Come utilizzare ruoli / autorità personalizzati in Spring Security?

Durante la migrazione di un’applicazione legacy alla sicurezza di spring ho ottenuto la seguente eccezione:

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”, “editor”, “helpdesk” ecc. Ma in tutti gli esempi di Spring Security 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:

      

Lavori:

     

È ansible utilizzare nomi di ruolo personalizzati?

Stai utilizzando la configurazione predefinita che prevede che i ruoli inizi con il prefisso "ROLE_" . Dovrai aggiungere una configurazione di sicurezza personalizzata e impostare rolePrefix su “”;

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

Ecco una configurazione completa utilizzando le espressioni di accesso (il collegamento fornito da @rodrigoap sembra un po ‘obsoleto):

             

Puoi anche sempre usare expression (da config use-expressions="true" ) per ignorare il prefisso ROLE_ .

Dopo aver letto il codice sorgente di Spring Security 3.1, ho trovato quando use-expressions="true" :

Per :
HttpConfigurationBuilder#createFilterSecurityInterceptor() registrerà WebExpressionVoter ma non RoleVoter , AuthenticatedVoter ;

Per : GlobalMethodSecurityBeanDefinitionParser#registerAccessManager() registrerà PreInvocationAuthorizationAdviceVoter (condizionalmente), quindi RoleVoter sempre 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 vota.

Usando Spring Security 3.2 , questo ha funzionato per me.

Cambia prefisso del ruolo:

             

A seconda di dove si desidera applicare il Prefisso del ruolo, può essere applicato a livello di schema di sicurezza o a livello di bean.

  

Applicare il prefisso del ruolo al livello di servizio:

      

Questo potrebbe anche aiutare:

http://forum.springsource.org/showthread.php?96391-Spring-Security-Plug-in-ROLE_-prefix-mandatory

Bassicamente, dice che devi scrivere in grails-app / conf / spring / resources.groovy:

 roleVoter(org.springframework.security.access.vote.RoleVoter) { rolePrefix = '' } 

Ha funzionato per me.