2012-02-23 6 views
5

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¿Cómo aseguro los recursos REST para que solo un usuario único de un rol pueda acceder a él?

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 fijado un reino con dos papeles: el usuario y admin

conseguí todos los métodos para que sólo los administradores pueden acceder a ellos.

Ahora quiero dar libre de los métodos PUT /users/{id} y GET /users/{id}, por lo que los usuarios pueden acceder a sus propios y sólo 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 

ya que no podía encontrar una manera de configurar esto a través de anotaciones, que estoy pensando pasar la solicitud HTTP al método correspondiente para comprobar si el usuario está autorizado a acceder al recurso.

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

@GET 
@Path("https://stackoverflow.com/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 abordaje porque yo creo que habría que añadir el userID manualy a la sesión.

  • ¿Conoces una manera 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("https://stackoverflow.com/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); 
} 

Respuesta

2

En el HttpServletRequest, puede llamar al 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 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 en 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 está utilizando 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 su pregunta específica.

+1

o puede inyectar SecurityContext, consulte http: // jersey. java.net/nonav/apidocs/1.11/jersey/javax/ws/rs/core/SecurityContext.html –

+0

Gracias Will por su visión ayudó mucho. @Pavel, gracias también. Ahora estoy usando el SecurityContext, se ve increíble ahora: D – Zounadire

0

Uno de los aspectos más importantes de la implementación de descanso es comprender el papel de las cabeceras HTTP y cookies

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

Leer

GWT and Google Docs API.

GWT-Platform login + session management

leer sobre Google el acceso federado, OAuth y OpenID.

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

+0

Hola Geek :) gracias por tu respuesta. Tal vez en mi caso eso sea un poco exagerado ya que el servicio REST solo es usado por un AJAX Web-Fronted al que solo se puede acceder después de haber iniciado sesión. Al leer tus Respuestas, no entendí por qué necesito un marco de autenticación. Tal vez podrías darme algo más de información yendo un poco más a mi caso y hacer uno o dos ejemplos para convencerme :). En cuanto a los encabezados y el punto de cookie, también podría necesitar alguna aclaración. – Zounadire

+0

http://stackoverflow.com/questions/9425884/different-browser-means-a-different-client-from-the-same-machine/9426183#9426183 –

Cuestiones relacionadas