tutorial example ejemplo java spring spring-security

java - example - spring security xml



@PreAuthorize anotaciĆ³n no funciona seguridad de primavera (9)

Deberías

<s:global-method-security pre-post-annotations="enabled"/>

Si desea que las anotaciones @PreAuthorize funcionen.

Para responder al comentario:

Parece que te estás perdiendo la dependencia spring-aop .

Si estás utilizando maven necesitas:

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${org.springframework.version}</version> </dependency>

Si no puedes conseguir el tarro desde here .

Encontré muchas preguntas similares pero ninguna ha resuelto mi problema. Mi problema es que ROLE_USER puede acceder a las funciones de ROLE_ADMIN

Mi código spring-security.xml está siguiendo.

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:s="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"> <s:http auto-config="true" use-expressions="true"> <s:intercept-url pattern="/index.jsp" access="permitAll" /> <s:intercept-url pattern="/welcome*" access="hasRole(''ROLE_USER'')" /> <s:intercept-url pattern="/helloadmin*" access="hasRole(''ROLE_ADMIN'')" /> <s:form-login login-page="/login" default-target-url="/welcome" authentication-failure-url="/loginfailed" /> <s:logout logout-success-url="/logout" /> </s:http> <s:authentication-manager> <s:authentication-provider> <s:user-service> <s:user name="asif" password="123456" authorities="ROLE_USER,ROLE_ADMIN" /> <s:user name="raheel" password="123456" authorities="ROLE_USER" /> </s:user-service> </s:authentication-provider> </s:authentication-manager>

cuando agrego <s:global-method-security pre-post-annotations="enabled"/> mi código muestra un error de recurso no encontrado y cuando ROLE_USER mi código se ejecuta correctamente pero ROLE_USER puede acceder a ROLE_ADMIN funciones ROLE_ADMIN

Mi función de control es.

@PreAuthorize("hasRole(''ROLE_ADMIN'')") @RequestMapping(value="/delete", method = RequestMethod.GET) public String DeleteAll(ModelMap model, Principal principal ) { org.springframework.security.core.userdetails.User activeUser = (org.springframework.security.core.userdetails.User)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); System.out.println("Active user is "+activeUser.getUsername()+"Authorities are "+activeUser.getAuthorities()); return "deleteUsers"; }


Estaba enfrentando el mismo problema. Mi problema se resolvió cuando moví el siguiente elemento de applicationContext.xml a * -servlet.xml (el xml de configuración de mi despachador).

<security:global-method-security secured-annotations="enabled"/>

Debe incluir este elemento en el código XML de su despachador NO en el código XML de su aplicación .
Preguntas frecuentes de primavera


Este problema surgirá cuando use Servlet 3 con Web Async Support. Spring Security 3.1.4 y anteriores pierden su contexto de seguridad una vez que ingresan al método anónimo del método Callable .

La actualización de Spring Security a 3.2.0 RC1 resolverá sus problemas.

Dependencia de Maven:

<dependencies> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>3.2.0.RC1</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>3.2.0.RC1</version> </dependency> </dependencies> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>http://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>http://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>


Esto podría ayudarte:

<security:global-method-security secured-annotations="enabled" proxy-target-class="true"/>

Saludos.


Ninguna de las respuestas anteriores ha funcionado para mí. Tuve que seguir el camino de agregar decoradores de seguridad.

Los decoradores se colocan en beans dentro del archivo servlet-context.xml .

Primero agregue el esquema de seguridad al espacio de nombres XML:

<beans:beans xmlns="http://www.springframework.org/schema/mvc" ... xmlns:security="http://www.springframework.org/schema/security" xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

Luego aplique el decorador a la implementación del bean de servicio, como así ...

<beans:bean id="myService" class="my.service.impl.MyServiceImpl" scope="request"> <security:intercept-methods> <security:protect access="ROLE_USER" method="get*"/> <security:protect access="ROLE_ADMIN" method="set*"/> </security:intercept-methods> </beans:bean>


Probar con la anotación segura

Entonces tendrás

@Secured("ROLE_ADMIN") @RequestMapping(value="/delete", method = RequestMethod.GET) public String DeleteAll(ModelMap model, Principal principal ) { ... }

Aquí hay una publicación detallada del blog al respecto .


Si está utilizando la configuración XML, no olvide agregar el siguiente atributo:

<s:global-method-security pre-post-annotations="enabled"/>

Si está utilizando la configuración de Java, no olvide agregar la siguiente anotación:

@EnableGlobalMethodSecurity(prePostEnabled = true)


Tuve el mismo problema al trabajar con las anotaciones, el problema era que no había una anotación de @Controller en mi controlador.

Así que parece que necesitas:

  • Estas anotaciones en su configuración Spring Security:

    @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true)

  • Estas anotaciones en tu controlador:

    @Controller public class ServiceRS { @RequestMapping(value = "/admin", method = RequestMethod.GET) @PreAuthorize("hasAuthority(''ROLE_ADMIN'')") public void wsAdmin() { [...] } }

Además, si aún tiene problemas, considere agregar esto a su configuración log4j2:

<Logger name="org.springframework.security" level="trace" additivity="false"> <AppenderRef ref="Console" /> <AppenderRef ref="RollingRandomAccessFile" /> </Logger>

Verá en los registros si sus anotaciones son consideradas por Spring:

TRACE org.springframework.security.access.prepost.PrePostAnnotationSecurityMetadataSource {} [main] Looking for Pre/Post annotations for method ''wsAdmin'' on target class ''***.ServiceRS'' DEBUG org.springframework.security.access.prepost.PrePostAnnotationSecurityMetadataSource {} [main] @org.springframework.security.access.prepost.PreAuthorize(value=hasAuthority(''ROLE_ADMIN'')) found on specific method: public void ***.ServiceRS.wsAdmin() DEBUG org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource {} [main] Caching method [CacheKey[***.ServiceRS; public void ***.ServiceRS.wsAdmin()]] with attributes [[authorize: ''hasAuthority(''ROLE_ADMIN'')'', filter: ''null'', filterTarget: ''null'']]

Y, obviamente, puede considerar agregar puntos de interrupción en los métodos correspondientes en org.springframework.security.access.expression.SecurityExpressionRoot para ver si se realiza una llamada con la condición en su anotación.

Saludos.


ponga la etiqueta a continuación en otro archivo de configuración de Spring, no en el archivo de configuración de seguridad de Spring.

Yo también estaba recibiendo el mismo error.

<security:global-method-security secured-annotations="enabled" proxy-target-class="true"/>