Come posso proteggere le risorse di riposo in modo che un solo utente di un ruolo possa accedervi?
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