J'ai créé avec succès un service web REST avec Jersey et l'ai sécurisé via des annotations de sécurité java. Il ressemble à ceciComment sécuriser les ressources REST afin qu'un seul utilisateur d'un rôle puisse y accéder?
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
J'ai aussi configurer un domaine avec deux rôles: utilisateur et admin
J'ai obtenu toutes les méthodes pour que seuls les administrateurs peuvent y accéder.
Maintenant, je veux donner gratuitement les méthodes PUT /users/{id}
et GET /users/{id}
, afin que les utilisateurs puissent accéder à leurs propres et seulement leurs propres ressources.
Exemple:
// user anna is logged in and uses the following methods
GET /users/anna // returns 200 OK
GET /users/pete // returns 401 UNAUTHORIZED
Comme je ne pouvais pas trouver un moyen de configurer ce à travers des annotations, je pense à passer la requête HTTP vers la méthode pour vérifier si l'utilisateur est autorisé à accéder à la ressource.
Il ressemblerait à quelque chose comme ça pour la méthode 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();
}
Je n'aime pas ce aproche parce que je pense que je dois ajouter le userID
manualy à la session.
Connaissez-vous une façon plus élégante de résoudre ce problème?
Si ce n'est pas comment ajouter l'ID utilisateur à la session lors de l'utilisation de l'authentification de formulaire?
EDIT
Merci Will et Pavel :) Voici ma solution finale:
@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);
}
ou vous pouvez injecter SecurityContext, voir http: // jersey. java.net/nonav/apidocs/1.11/jersey/javax/ws/rs/core/SecurityContext.html –
Merci Will pour votre perspicacité a beaucoup aidé. Merci @Pavel aussi je suis maintenant en utilisant le SecurityContext semble génial maintenant: D – Zounadire