Comment sécuriser les ressources de repos afin qu'un seul utilisateur d'un rôle puisse y accéder?

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

Question

J'ai réussi à créer un service Web REST avec Jersey et je l'ai sécurisé via Java Security Annotations. Ça ressemble à quelque chose comme ça

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 également configuré un royaume avec deux rôles: l'utilisateur et l'administrateur

J'ai obtenu toutes les méthodes afin que seuls les administrateurs puissent y accéder.

Maintenant je veux donner libre PUT /users/{id} et GET /users/{id} méthodes, afin que les utilisateurs puissent accéder à leur posséder et Seulement le leur 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 n'ai pas pu trouver de moyen de configurer cela via des annotations, je pense passer la demande HTTP à la méthode correspondante pour vérifier si l'utilisateur est autorisé à accéder à la ressource.

Cela ressemblerait à quelque chose comme ça pour le GET /users/{id} méthode:

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

Je n'aime pas cet aperçu parce que je pense que je devrais ajouter le userID manuelle à la session.

  • Connaissez-vous un moyen plus élégant de résoudre ce problème?

  • Sinon, comment ajoutez-vous l'UserId à la session lors de l'utilisation de l'authentification du formulaire?

ÉDITER

Merci Will et Pavel :) Voici ma solution 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);
}

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top