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 ) {
...
}
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"/>