2010-01-20 12 views
18

Estoy intentando configurar Spring 3 de seguridad usando JDBC auth. Todo funciona bien, aparte de cuando intento especificar múltiples roles de acceso a una URL de intercepción. Por ejemplo, yo quiero que nadie con los papeles ROLE_USER y ROLE_ADMIN para poder acceder a todas las páginas, utilizo la línea follwoing en mi primavera archivo de configuración -Spring Security 3 especifica múltiples roles de acceso de intercepción-url

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

Sin embargo esto arroja el siguiente error -

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 especifica que solo uno de los roles puede acceder a cualquier url, está bien (bien para cualquier función). Cambiar el orden en el que especifico los roles tampoco hace ninguna diferencia. Es como si algo hubiera cambiado en Spring Security 3 que ahora no puede manejar los múltiples roles de acceso que se especifican.

He logrado que esto funcione previamente con Spring Security 2, y estoy usando prácticamente la misma configuración. ¿Algunas ideas?

Mi archivo de configuración de seguridad se enumeran a continuación -

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

Respuesta

-2

decidí hacer un downgrade a 2.0.5 Spring Security sin cambiar nada más para comprobar si se trataba de un error en el 3, y lo-y, he aquí, ¡estaba!

creo que también he encontrado un bug relacionado abierta aquí - https://jira.springsource.org/browse/SEC-1342

Solution - 2.0.5 utilizar si desea utilizar esta función.

45

he tenido el mismo problema, pero utilizan expresiones para solucionar este problema:

Debe incrustar

use-expressions="true" 

en su configuración existente. Por lo tanto:

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

convierte

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

Y luego:

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

No estoy seguro acerca de este problema, en realidad lo estoy usando actualmente en mi proyecto y no ve una problema. intente eliminar el espacio después del "," quiero decir, intente usar ROLE_USER, ROLE_ADMIN

+3

Teja tienes razón, no puede manejar espacios después de la coma. Funciona bien sin espacios. – user223695

+0

El mensaje de error deja en claro que este es el problema: "Atributos de configuración no admitidos: [ROLE_ADMIN]" –

4

Tuve el mismo problema y encontré la respuesta here.
Use esa línea para permitir el acceso a usuarios con los dos papeles:
<security:intercept-url pattern="/**" access="hasRole('ROLE_USER') and hasRole('ROLE_ADMIN')" />
Si desea conceder acceso a los usuarios con una de las funciones enumeradas, utilice:
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN')" />

Además, es necesario añadir capacidad de utilizar SpEL en su seguridad * .xml, agregue use-expressions="true" a <http> etiqueta.

7

Tuve el mismo problema cuando intentaba migrar de Spring 3.x a 4.x. Finalmente, encontré que el parámetro "use-expressions" de la etiqueta "http" se convirtió en "true" de forma predeterminada en Spring 4.x en lugar de en false (como en las versiones anteriores).

P.S. Esta pregunta es muy antigua por ahora, pero encontré esto en Google. Entonces, alguien más puede encontrarlo y esta información podría ser útil.

Cuestiones relacionadas