2009-06-12 4 views
28

Lors de la migration d'une application héritée au printemps sécurité, je suis l'exception suivante:Comment utiliser les rôles/autorités personnalisés dans 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) 

Dans l'ancienne application, il y a des rôles tels que « superadmin », « rédacteur en chef », « help desk », etc. Mais dans tous les exemples de sécurité de printemps Je vois seulement des rôles comme "ROLE_" ("ROLE_ADMIN" etc). Lorsque je renomme "superadmin" en "ROLE_ADMIN" et n'utilise ce rôle que dans la configuration, tout fonctionne.

ne fonctionne pas:

<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> 

Travaux:

<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> 

est possible d'utiliser des noms de rôles personnalisés?

+0

Cette [question] (http://stackoverflow.com/questions/283870/acegi-security-how-do-i-add -une autre autorisation accordée-à-l'authentification-à-anonym) peut aider. – kgiannakakis

Répondre

39

Vous utilisez la configuration par défaut qui s'attend à ce que les rôles commencent par le préfixe "ROLE_". Vous devrez ajouter une configuration de sécurité personnalisée et définir rolePrefix sur "";

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

+0

Puis-je avoir un ROLE_FOO ou un ROLE_BAR ou un ROLE_ANYTHING_I_WANT? Le lien que vous avez fourni ne résout pas le problème, c'est juste un gars disant "Impossible de définir RolePrefix pour RoleVoter" –

+6

Oui, vous pouvez avoir le rôle que vous voulez. Le lien montre un exemple de configuration et il ne peut pas vous aider, mais il était utile à D. Wroblewski. Si vous avez besoin d'aide pour poster une nouvelle question, beaucoup de gens sont prêts à y répondre. – rodrigoap

+0

merci. sauvé ma journée –

11

Voici une configuration complète en utilisant des expressions d'accès (lien fourni par @rodrigoap semble un peu dépassée):

<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

Vous pouvez également toujours utiliser l'expression (par config use-expressions="true") pour ignorer le préfixe ROLE_.

Après avoir lu le code source de sécurité Spring 3.1, je trouve quand use-expressions="true":

Pour <security:http >:
HttpConfigurationBuilder#createFilterSecurityInterceptor() sera REGIST WebExpressionVoter mais pas RoleVoter, AuthenticatedVoter;

Pour <security:global-method-security >: GlobalMethodSecurityBeanDefinitionParser#registerAccessManager() sera REGIST PreInvocationAuthorizationAdviceVoter (sous condition), puis toujours Regist RoleVoter, AuthenticatedVoter, Regist Jsr250Voter conditionnelle;

PreInvocationAuthorizationAdviceVoter va traiter PreInvocationAttribute (PreInvocationExpressionAttribute sera utilisé comme implémentation) qui est généré selon @PreAuthorize. PreInvocationExpressionAttribute#getAttribute() toujours retourner null, donc RoleVoter, AuthenticatedVoter ne pas voter.

2

En utilisant Spring Security 3.2, cela a fonctionné pour moi.

Changer le rôle Prefix:

<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> 

Selon l'endroit où vous souhaitez appliquer le préfixe de rôle peut être appliqué au niveau du schéma de sécurité ou le niveau de haricot.

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

Appliquer le préfixe de rôle au niveau de service:

<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> 
Questions connexes