2012-08-07 18 views
21

Encontré muchas preguntas similares pero ninguna ha resuelto mi problema. Mi problema es ROLE_USER puede acceder a las funciones de ROLE_ADMIN@PreAuthorize anotación no funciona seguridad de primavera

Mi código spring-security.xml es el siguiente.

<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 de error muestra los recursos que no se encuentra y cuando quito mi código de ejecutar con éxito pero ROLE_USER puede acceder ROLE_ADMIN funciones

Mi función del controlador 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"; 

} 

Respuesta

21

Debe tener

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

Si desea que los @PreAuthorize anotaciones para trabajar.


Para responder a la comentario:

Parece que se está perdiendo la dependencia spring-aop.

Si está utilizando Maven que necesita:

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

Si no se puede obtener el tarro de here.

+0

Sí, lo sé, pero cuando agrego mi código muestra recurso no se encuentra el error, ¿sabe cómo solucionarlo? – Raheel

+0

Excepción enviar suceso inicializado contexto a instancia de escuchador de org.springframework.web.context.ContextLoaderListener clase org.springframework.beans.factory.BeanDefinitionStoreException: Inesperado documento XML excepción de análisis de recursos ServletContext [/WEB-INF/spring-security.xml ]; la excepción anidada es java.lang.NoClassDefFoundError: org/aopalliance/interceptar/MethodInterceptor – Raheel

+0

y estoy usando spring security3.07 – Raheel

3

Pruebe con @Secured anotación,

entonces tendrás

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

    ... 

} 

Aquí es a detailed blog post about it.

1

Esto podría ayudarle a:

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

Saludos.

+0

¡Muchas gracias! Solucionó mis problemas. – WhiteWater

2

Ninguna de las respuestas anteriores me ha funcionado. Tenía que ir por la ruta de agregar decoradores de seguridad.

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

primero Añadir esquema de seguridad para el 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"> 

A continuación, aplicar el decorador a la aplicación de la haba 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> 
1

Este problema surgirá cuando se utiliza Servlet 3 con soporte Web Async. Spring Security 3.1.4 y versiones posteriores pierden su contexto de seguridad una vez que entran en contacto con el método anónimo del método Callable.

Al actualizar Spring Security to 3.2.0 RC1 resolverá sus problemas.

Maven dependencia:

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

que estaba frente a la misma cuestión. Mi problema se resolvió cuando moví el elemento a continuación de applicationContext.xml a * -servlet.xml (xml de configuración de mi despachador).

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

tiene que incluir este elemento en XML su del despachador NO en XML de su aplicación.
Spring FAQ

+1

Esta es definitivamente la respuesta correcta si al menos no tiene el método de seguridad global definido en la configuración xml de su servlet- – chrismarx

+0

Este fue el problema exacto, +1 para mencionar el enlace de Preguntas frecuentes de Spring para obtener una explicación. –

21

Si está utilizando la configuración de XML no se olvide de añadir el siguiente atributo:

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

Si está utilizando la configuración de Java no se olvide de añadir la siguiente anotación:

@EnableGlobalMethodSecurity(prePostEnabled = true)

0

poner debajo de la etiqueta en otro archivo de configuración de primavera, no en primavera configuración de seguridad fil mi.

También recibía el mismo error.

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