2010-01-20 6 views
18

J'essaye de configurer la sécurité de Spring 3 en utilisant l'authentification JDBC. Tout fonctionne correctement, sauf lorsque j'essaie de spécifier plusieurs rôles d'accès à une URL d'interception. Par exemple, je veux quelqu'un avec les rôles ROLE_USER et ROLE_ADMIN pour pouvoir accéder à toutes les pages, j'utilise la ligne follwoing dans mon fichier de configuration de printemps -Spring Security 3 spécifier plusieurs rôles d'accès d'URL d'interception

<security:intercept-url pattern="/**" access="ROLE_USER, ROLE_ADMIN" /> 

Cependant cela jette l'erreur suivante -

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.access.intercept.FilterSecurityInterceptor#0': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Unsupported configuration attributes: [ ROLE_ADMIN] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1401) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:289) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:286) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:188) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:558) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:852) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:422) 
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843) 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 
    at org.apache.catalina.core.StandardService.start(StandardService.java:516) 
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 
Caused by: java.lang.IllegalArgumentException: Unsupported configuration attributes: [ ROLE_ADMIN] 
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.afterPropertiesSet(AbstractSecurityInterceptor.java:154) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398) 
    ... 27 more 

Si vous spécifiez qu'un seul des rôles peut accéder à n'importe quelle URL, alors c'est bien (bien pour chaque rôle). Changer l'ordre dans lequel je spécifie les rôles ne fait pas non plus de différence. C'est comme si quelque chose avait changé dans Spring Security 3 qui ne peut plus gérer les rôles d'accès multiples spécifiés.

Je l'ai réussi avec Spring Security 2 et j'utilise pratiquement la même configuration. Des idées?

Mon fichier de configuration de sécurité est ci-dessous -

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:security="http://www.springframework.org/schema/security" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
       http://www.springframework.org/schema/security 
       http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 

    <security:http auto-config="true" access-denied-page="/denied.jsp" >  
     <security:form-login 
      default-target-url="/app/home" 
      always-use-default-target="true" /> 

     <security:intercept-url pattern="/**" access="ROLE_USER, ROLE_ADMIN" /> 

     <security:logout invalidate-session="true" logout-url="/logout" logout-success-url="" /> 
    </security:http> 

    <security:authentication-manager> 
     <security:authentication-provider> 
      <security:jdbc-user-service data-source-ref="dataSource" 
       users-by-username-query='select "username", "password", "enabled" 
        from users where "username" = ?' 
       authorities-by-username-query='select "username", "authority"      from user_roles where "username" = ?' /> 
     </security:authentication-provider> 
    </security:authentication-manager> 
</beans> 

Répondre

-2

j'ai décidé de revenir à la sécurité Spring 2.0.5 sans rien changer d'autre pour vérifier si cela était un bogue dans 3, et lo-et-voici ce était!

Je pense que j'ai aussi trouvé un bug ouvert lié ici - https://jira.springsource.org/browse/SEC-1342

Solution - utiliser 2.0.5 si vous voulez utiliser cette fonction.

45

J'ai eu le même problème, mais a utilisé des expressions pour contourner ce problème:

Vous devez intégrer

use-expressions="true" 

dans votre configuration existante. Alors:

<security:http auto-config="true" access-denied-page="/denied.jsp" > 

devient

<security:http auto-config="true" access-denied-page="/denied.jsp" use-expressions="true"> 

Et puis:

<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
11

Je ne suis pas sûr de ce problème, je l'utilise en fait actuellement dans mon projet et ne vois pas problème. essayer de supprimer l'espace après le "," je veux dire essayer d'utiliser ROLE_USER, ROLE_ADMIN

+3

Teja vous avez raison, il ne peut pas gérer les espaces après la virgule. Cela fonctionne bien sans espaces. – user223695

+0

Le message d'erreur indique clairement que c'est bien le problème: "Attributs de configuration non pris en charge: [ROLE_ADMIN]" –

4

J'ai eu le même problème et trouvé la réponse here.
Utilisez cette ligne pour accorder l'accès à l'utilisateur avec les deux rôles:
<security:intercept-url pattern="/**" access="hasRole('ROLE_USER') and hasRole('ROLE_ADMIN')" />
Si vous souhaitez accorder l'accès à l'utilisateur avec l'un des rôles énumérés, utilisez:
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN')" />

En outre, vous devez ajouter la capacité à utiliser Spel dans votre sécurité * .xml, ajouter use-expressions="true" à <http> tag.

7

J'ai rencontré le même problème lors de la migration de Spring 3.x vers 4.x. Enfin, j'ai trouvé que le paramètre "use-expressions" de la balise "http" est devenu "true" par défaut dans Spring 4.x au lieu de false (comme c'était le cas dans les anciennes versions).

P.S. Cette question est très ancienne pour l'instant, mais je l'ai trouvé dans Google. Donc, quelqu'un d'autre peut le trouver aussi et cette information pourrait être utile alors.

Questions connexes