Come posso proteggere le risorse di riposo in modo che un solo utente di un ruolo possa accedervi?

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

Domanda

Ho creato con successo un servizio Web Rest con Jersey e l'ho assicurato tramite Annotazioni di sicurezza Java. Assomiglia a questo

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

Ho anche impostato un regno con due ruoli: utente e amministratore

Ho ottenuto tutti i metodi in modo che solo gli amministratori possano accedervi.

Ora voglio dare gratuitamente il PUT /users/{id} e GET /users/{id} metodi, in modo che gli utenti possano accedere al loro possedere e solo il loro risorse.

Esempio:

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

Dal momento che non sono riuscito a trovare un modo per configurarlo attraverso le annotazioni, sto pensando di passare la richiesta HTTP al metodo corrispondente per verificare se all'utente è autorizzato ad accedere alla risorsa.

Sembrerebbe qualcosa di simile per il GET /users/{id} metodo:

@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();
}

Non mi piace questo appendiabiti perché penso che dovrei aggiungere il userID Manualità alla sessione.

  • Conosci un modo più elegante per risolverlo?

  • In caso contrario, come si aggiunge l'utente alla sessione durante l'utilizzo dell'autenticazione del modulo?

MODIFICARE

Grazie Will e Pavel :) Ecco la mia soluzione finale:

@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);
}

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top