En esta entrada veremos cómo recuperar información del usuario que invoca un método de nuestra API REST, siempre que implemente el estándar JAX-RS. Para ello haremos uso del contexto de seguridad (SecurityContext) que podemos inyectar tanto en nuestro método como en la clase.
El contexto de seguridad almacena información relativa a la seguridad dentro del contexto de la petición. Entre los métodos que tenemos que implementar está “isUserInRole” que devuelve un booleano indicando si el usuario logado tiene el rol pasado como parámetro al método. También almacena el nombre del usuario.
Podemos utilizar la información del contexto de seguridad, por ejemplo, para realizar alguna operación especial o comprobación, en función de los roles del usuario que realiza la petición. También podemos recuperar el usuario que realiza una determinada operación para guardar esa información como parte de la auditoría de nuestra aplicación.
A continuación mostramos como inyectarlo y usarlo en un método:
@GET @Produces({MediaType.APPLICATION_JSON+";charset=utf-8"}) @Secured public Pelicula findPeliculas(@Context SecurityContext secContext, @QueryParam("titulo") String titulo, @QueryParam("nombreActor") String nombreActor) throws Exception{ //Podemos comprobar si el usuario tiene un rol determinado if(secContext.isUserInRole("ADMINISTRADOR")) { //Realizar alguna operación específica para el administrador } //Podemos recuperar el nombre del usuario String nombre = null; Principal p = secContext.getUserPrincipal(); if(p != null) { nombre = p.getName(); } // Habría que llamar a un servicio de búsqueda de películas return getPeliculaEjemplo(); }
La anotación @Context es la que nos permite inyectar de un modo sencillo el contexto de seguridad.
Si queremos inyectarlo como atributo de la clase que contiene los métodos pondríamos:
@Path("/pelicula") public class PeliculaResource { @Context SecurityContext secContext; ...
Espero que esta entrada te haya resultado útil. Por favor, valórala y deja tu comentario si tinenes cualquier duda.