Tengo varias API REST.
Me gustaría poner Seguridad encima de todos ellos, para permitir las funcionalidades solo para ciertos roles.
Puse @EnableGlobalMethodSecurity(prePostEnabled = true) en la clase de configuración.
Tengo una base de datos con una tabla que almacena los roles.
@RequestMapping(path = "/error", method = RequestMethod.GET) @PreAuthorize("hasRole('ROLE_ADMIN')") public ResponseEntity<ResponseWrapper> getError(... INSERT INTO table USER_ROLE VALUES ('ADMIN','PASSWORD','ROLE_ADMIN');¿Cómo puede el método "hasRole" consultar la tabla USER_ROLE? ¿Hay alguna configuración que deba darle a Spring para poder comunicarme con esa mesa?
Asegúrese de agregar lo siguiente a su configuración:
Estilo de anotación:
@EnableGlobalMethodSecurity(prePostEnabled = true)Estilo XML:
<global-method-security pre-post-annotations="enabled"/>Todo está en los documentos de primavera .
El uso de anotaciones @Pre y @Post requiere que primero haya configurado Spring Security en su proyecto. Los roles de usuario se cargan durante la autenticación en la implementación estándar.
No verifica su tabla cuando verifica la anotación (de manera predeterminada), solo verifica el objeto Principal (Usuario) en la memoria para la lista de GrantedAuthority asignada (Roles).
Una mirada más cercana...
Eche un vistazo a la interfaz UserDetailsService , esto devuelve una instancia de UserDetails (el Principal ). Aquí es donde obtenemos su "usuario" de la base de datos.
La interfaz UserDetails define un método llamado getAuthorities() que devuelve un Collection<? extends GrantedAuthority> , esencialmente su tabla de Role . Aquí es donde los "Roles" se almacenan en la memoria y luego se pueden verificar mediante las anotaciones @Pre y @Post .
La implementación que he explicado anteriormente se puede encontrar aquí .