utilizamos usuarios usuario rol qué plugin permisos para nuevo manejo función crear cambiar asignar administrar security java-ee jersey realm

security - qué - rol de usuarios en wordpress



¿Cómo aseguro los recursos REST para que solo un usuario único de un rol pueda acceder a él? (2)

En HttpServletRequest , puede llamar a getRemoteUser() o getUserPrincipal() para obtener la identidad del usuario que ha iniciado sesión. Luego continuaría como lo está haciendo al permitir o negarles específicamente el acceso al recurso en particular.

Blessed Geek se refiere más específicamente al aspecto de REST con respecto a las transacciones sin estado y el uso de la autenticación HTTP. Si bien este es un punto importante en el ámbito más amplio de una arquitectura REST, es menos relevante para su pregunta específica ya que no especifica el tipo de mecanismo de autenticación que está utilizando contra su aplicación Java EE, especialmente dado que la autenticación es un problema contenedor en Java EE, no es un problema de aplicación.

Si usa la autenticación básica, está usando encabezados HTTP para administrar la autenticación y la autorización. Si usa la autenticación basada en formularios, el contenedor lo administra por usted a través de la sesión de servlet, lo que hace que el servicio tenga estado (ya que las sesiones son un artefacto con estado).

Pero esto no tiene relación con tu pregunta específica.

He creado con éxito un servicio web REST con Jersey y lo aseguré a través de anotaciones de seguridad de Java. Se ve algo como esto

GET /users/ // gives me all users GET /users/{id} // gives the user identified by {id} POST /users/ // creates user PUT /users/{id} // updates user identified by {id} DELETE /users/{id} // delete user

También he configurado un reino con dos roles: usuario y administrador

Aseguré todos los métodos para que solo los administradores puedan acceder a ellos.

Ahora quiero dar gratuitamente los métodos PUT /users/{id} y GET /users/{id} , para que los usuarios puedan acceder a los suyos y solo a sus propios recursos.

Ejemplo:

// user anna is logged in and uses the following methods GET /users/anna // returns 200 OK GET /users/pete // returns 401 UNAUTHORIZED

Como no pude encontrar una forma de configurar esto mediante anotaciones, estoy pensando en pasar la solicitud HTTP al método correspondiente para verificar si el usuario tiene permiso para acceder al recurso.

Se vería algo así para el método GET /users/{id} :

@GET @Path("/users/{id}") @RolesAllowed({"admin","user"}) @Produces(MediaType.APPLICATION_JSON) public Response getUser( @PathParam("id") String id, @Context HttpServletRequest req ) { HttpSession session = request.getSession(false); if (session != null && session.getValue("userID").equals(id)) return getObject(User.class, id); return Response.status(Status.UNAUTHORIZED).build(); }

No me gusta este enfoque porque creo que debería agregar manualmente el ID de usuario a la sesión.

  • ¿Conoces una forma más elegante de resolver esto?

  • Si no, ¿cómo se agrega el ID de usuario a la sesión mientras se usa la autenticación de formulario?

EDITAR

Gracias Will y Pavel :) Aquí está mi solución final:

@Context private SecurityContext security; // ... @GET @Path("/users/{id}") @RolesAllowed({"admin","user"}) @Produces(MediaType.APPLICATION_JSON) public Response getUser(@PathParam("id") String id){ if (security.isUserInRole("user")) if (security.getUserPrincipal().getName().equals(id)) return getObject(User.class, id); else return Response.status(Status.UNAUTHORIZED).build(); else return getObject(User.class, id); }


Uno de los aspectos más importantes de la implementación de REST es comprender el rol de los encabezados y las cookies http.

Para que REST sea práctico, debe implementar un marco de autenticación.

Leer

GWT y la API de Google Docs .

GWT-Platform login + gestión de sesiones

Lea en Google Federated Login, OAuth y OpenID.

Algunas de mis explicaciones pueden estar desactualizadas si se publicaron antes de OAuth 2.0.