¿Cómo aseguro los recursos de descanso para que solo un solo usuario de un rol pueda acceder a él?

StackOverflow https://stackoverflow.com/questions/9406258

Pregunta

He creado con éxito un servicio web de descanso con Jersey y lo aseguré a través de anotaciones de seguridad Java. Se ve 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 gratis el PUT /users/{id} y GET /users/{id} métodos, para que los usuarios puedan acceder a su propio y Solo el suyo 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 manera de configurar esto a través de anotaciones, estoy pensando en pasar la solicitud HTTP al método correspondiente para verificar si el usuario puede acceder al recurso.

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

@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 Aproach porque creo que tendría que agregar el userID Manual a la sesión.

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

  • Si no, ¿cómo agrega el ID de usuario a la sesión mientras 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);
}

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top