Spring Security 3 spécifier plusieurs rôles d'accès intercept-url
j'essaie de configurer la sécurité du printemps 3 en utilisant JDBC auth. Tout fonctionne bien à part quand j'essaie de spécifier plusieurs rôles d'accès à une interception d'url. Eg je veux que n'importe qui avec les rôles ROLE_USER et ROLE_ADMIN soit capable d'accéder à toutes les pages, j'utilise la ligne suivante dans mon fichier de configuration de printemps -
<security:intercept-url pattern="/**" access="ROLE_USER, ROLE_ADMIN" />
Toutefois, cela déclenche 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.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 spécifiez qu'un seul des rôles peut accéder à n'importe quelle url alors il est très bien (très bien pour l'un ou l'autre rôle.) Modifier l'ordre dans lequel je préciser les rôles ne fait aucune différence. C'est comme si quelque chose avait changé dans la sécurité du printemps 3 qui ne peut plus Gérer les rôles d'accès multiples étant spécifiés.
j'ai déjà réussi à faire fonctionner ce système avec Spring Security 2, et j'utilise pratiquement la même configuration. Des idées?
la sécurité de Mon fichier de config est énuméré 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>
5 réponses
j'ai eu le même problème mais des expressions d'usage pour obtenir autour de cette question:
Vous devez intégrer
use-expressions="true"
dans votre configuration existante. Donc:
<security:http auto-config="true" access-denied-page="/denied.jsp" >
devient
<security:http auto-config="true" access-denied-page="/denied.jsp" use-expressions="true">
puis:
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" />
je ne suis pas sûr de ce problème, en fait je l'utilise actuellement dans mon projet et je ne vois pas un problème. essayez de supprimer l'espace après le", " je veux dire essayer D'utiliser ROLE_USER,ROLE_ADMIN
j'ai eu le même problème quand j'ai essayé de migrer à partir du printemps 3.x à 4.x. Finalement, j'ai trouvé que le paramètre "use-expressions" de la balise "http" est devenu "true" par défaut au printemps 4.x au lieu de false (comme dans les anciennes versions).
j'ai eu le même problème et trouvé la réponse ici.
Utiliser 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 la liste des rôles, utilisez: <security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN')" />
vous devez également ajouter la possibilité D'utiliser SpEL dans votre sécurité *.xml, ajouter use-expressions="true"
<http>
balise.
j'ai décidé de descendre à la sécurité de printemps 2.0.5 sans rien changer d'autre pour vérifier si c'était un bug en 3, et lo-and-see il l'était!
je pense que j'ai aussi trouvé une relative bug ouvert ici - https://jira.springsource.org/browse/SEC-1342
Solution-utilisez 2.0.5 si vous voulez utiliser cette fonctionnalité.