tutorial j_spring_security_check example español ejemplo spring-security url-interception

j_spring_security_check - Spring Security 3 especifica múltiples roles de acceso de intercepción-url



spring security tutorial (5)

Estoy intentando configurar la seguridad de Spring 3 con JDBC auth. Todo funciona bien, aparte de cuando intento especificar múltiples roles de acceso a una URL de intercepción. Por ejemplo, quiero que cualquiera con los roles ROLE_USER y ROLE_ADMIN pueda acceder a todas las páginas, utilizo la siguiente línea en mi archivo de configuración de primavera:

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


Decidí cambiar a Spring Security 2.0.5 sin cambiar nada más para comprobar si se trataba de un error en 3, ¡y lo que era!

Creo que también encontré un error abierto relacionado aquí - https://jira.springsource.org/browse/SEC-1342

Solución: use 2.0.5 si desea usar esta característica.


No estoy seguro acerca de este problema, de hecho lo estoy usando actualmente en mi proyecto y no veo un problema. intenta eliminar el espacio después de "," quiero decir, intenta usar ROLE_USER, ROLE_ADMIN


Tuve el mismo problema pero usé expresiones para evitar este problema:

Deberías incrustar

use-expressions="true"

en tu configuración existente Asi que:

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

se convierte

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

Y entonces:

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


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

PD: 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.


Tuve el mismo problema y encontré la respuesta aquí .
Use esa línea para otorgar acceso al usuario con ambos roles:
<security:intercept-url pattern="/**" access="hasRole(''ROLE_USER'') and hasRole(''ROLE_ADMIN'')" />
Si desea otorgar acceso al usuario con uno de los roles listados, use:
<security:intercept-url pattern="/**" access="hasAnyRole(''ROLE_USER'', ''ROLE_ADMIN'')" />

Además, debe agregar la capacidad de usar SpEL en su seguridad * .xml, agregue use-expressions="true" a la etiqueta <http> .