Can Spring Security use @PreAuthorize
en los métodos de los controladores Spring?Can Spring Security usa @PreAuthorize en los métodos de los controladores Spring?
Respuesta
Sí, funciona bien.
Necesita <security:global-method-security pre-post-annotations="enabled" />
en ...-servlet.xml
. También requiere CGLIB proxies, por lo tanto, sus controladores no deberían tener interfaces, o debe usar proxy-target-class = true
.
Ver Spring Security FAQ (énfasis mío).
En una aplicación web de Primavera, el contexto de aplicación que contiene los granos de Spring MVC para el servlet despachador es a menudo separado del contexto de aplicación principal . A menudo se define en un archivo llamado myapp-servlet.xml, donde "myapp" es el nombre asignado al Spring DispatcherServlet en web.xml. Una aplicación puede tener múltiples DispatcherServlets, cada uno con su propio contexto de aplicación aislado. Los beans en estos contextos "secundarios" no son visibles para el resto de la aplicación . El contexto de la aplicación "principal" se carga con el ContextLoaderListener que define en su web.xml y está visible para todos los contextos secundarios . Este contexto primario generalmente es donde define su configuración de seguridad, incluido el elemento ). Como resultado, las limitaciones de seguridad aplicadas a los métodos en estos beans web no se aplicarán, ya que los beans no se pueden ver desde el contexto DispatcherServlet. Debe mover la declaración al contexto web o mover los beans que desea asegurar en el contexto de la aplicación principal.
En general, recomendaríamos aplicar la seguridad del método en la capa de servicio en lugar de en los controladores web individuales.
Si se aplica a la capa pointcuts servicio solo es necesario para establecer <global-method-security>
en el contexto de seguridad de la aplicación.
Estaba tratando de usar @PreAuthorize en el controlador, no funcionó, funcionó una vez que me mudé a la capa de servicio. – MarCrazyness
Si está utilizando Spring 3.1, puede hacer algunas cosas muy interesantes con esto. Eche un vistazo al https://github.com/mohchi/spring-security-request-mapping. Es un proyecto de ejemplo que se integra con @PreAuthorize RequestMappingHandlerMapping de Spring MVC para que pueda hacer algo como:
@RequestMapping("/")
@PreAuthorize("isAuthenticated()")
public String authenticatedHomePage() {
return "authenticatedHomePage";
}
@RequestMapping("/")
public String homePage() {
return "homePage";
}
Una petición de "/" va a llamar authenticatedHomePage() si el usuario es autenticado. De lo contrario, llamará homePage().
Hace más de dos años que se formuló esta pregunta, pero debido a problemas que tuve hoy, preferiría desalentar el uso de @Secured
, @PreAuthorize
, etc. en @Controller
s.
Lo que no funcionó para mí fue @Validated
combinarse con @Secured
controlador:
@Controller
@Secured("ROLE_ADMIN")
public class AdministrationController {
// @InitBinder here...
@RequestMapping(value = "/administration/add-product", method = RequestMethod.POST)
public String addProductPost(@ModelAttribute("product") @Validated ProductDto product, BindingResult bindingResult) {
// ...
}
Validador simplemente no lo hace el fuego (Spring MVC 4.1.2, 3.2.5 Seguridad de Primavera) y se llevan a cabo ninguna comprobación.
problemas similares son causados por los proxies CGLIB utilizados para la primavera (cuando no hay interfaz implementada por una clase, Primavera crea CGLIB de proxy, si la clase implementa cualquier interfaz entonces se genera JDK proxy - documentation, well explained here y here).
Como se menciona en las respuestas que he vinculado anteriormente, es mejor utilizar las anotaciones de Spring Security en la capa de servicio que generalmente implementa interfaces (por lo que se utilizan los Proxy JDK) ya que esto no genera tales problemas.
Si desea proteger los controladores web, la mejor idea es usar <http>
y <intercept-url />
que están vinculados a direcciones URL específicas en lugar de métodos en controladores y funcionan bastante bien. En mi caso:
<http use-expressions="true" disable-url-rewriting="true">
...
<intercept-url pattern="/administration/**" access="hasRole('ROLE_ADMIN')" />
</http>
para extender la respuesta proporcionada por Andy, puede utilizar:
@PreAuthorize("hasRole('foo')")
para comprobar la función específica.
Ya existe una respuesta sobre cómo hacer que funcione cambiando la configuración xml; Sin embargo, si se está trabajando con la configuración basada en el código, puede lograr el mismo mediante la colocación de la siguiente anotación sobre su clase @Configuration
:
@EnableGlobalMethodSecurity(prePostEnabled=true)
- 1. Spring Security Meta Annotation
- 2. Spring Security: método no está garantizado con @PreAuthorize anotación
- 3. Spring security accessing principal
- 4. Can Spring Security admite múltiples puntos de entrada?
- 5. Spring MVC: @SessionAttributes compartido entre los controladores?
- 6. Spring Security Encrypt MD5
- 7. ¿Puedo usar Spring Social con Spring Security?
- 8. Filtro IP usando Spring Security
- 9. Spring Security filtro personalizado
- 10. ¿Llamando a métodos estáticos de Spring Security Expressions?
- 11. Spring Security: setUserPrincipal manualmente
- 12. Grails Spring Security Testing
- 13. burying authentication spring security
- 14. Spring Security HTTP Basic Autenticación
- 15. primavera Lenguaje Expresión y Spring Security 3: el acceso a la referencia de frijol en @PreAuthorize
- 16. Uso programático de Spring Security
- 17. ¿Cómo encontrar todos los controladores en Spring MVC?
- 18. Grails, Spring Security & Siteminder - problemas con los recursos o userDetails
- 19. ¿Cuál es la diferencia entre @Secured y @PreAuthorize en spring security 3?
- 20. Configuración básica de Spring Security
- 21. spring-security: autorización sin autenticación
- 22. Spring Security Child Thread Context
- 23. Spring Security, Spring MVC y Sesiones de inicio de sesión
- 24. Comparta una ruta padre común cuando implemente los controladores Spring
- 25. Cómo configurar Spring Security SecurityContextHolder strategy?
- 26. Spring 3.1 MVC, Spring Security 3.1 - CSRF token
- 27. Spring Security OpenID - UserDetailsService, AuthenticationUserDetailsService
- 28. spring security AuthenticationManager vs AuthenticationProvider?
- 29. Spring Security y CAS Integration
- 30. Group and acl en Spring Security
que poner eso en mi contexto de aplicación de seguridad de muelle (que ya tenía en realidad), pero Spring no hace nada con los controladores que usan @Controller. ¿Tengo que hacer algo especial para que esto funcione más allá de lo que dices? En – egervari
dije, 'global-method-security' debería estar en el contexto de DispatcherServlet (' ...- servlet.xml') no en "contexto de la aplicación de seguridad de primavera". – axtavt
Gracias! No lo moví porque no podía ver por qué iba a hacer una diferencia, ya que se fusiona ... Supongo que no lo hizo;) ¡Funciona ahora! – egervari