ロールの1人のユーザーのみがそれにアクセスできるように、RESTリソースを保護するにはどうすればよいですか?

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

質問

私はジャージーと一緒にレストウェブサービスを成功させ、Javaセキュリティアノテーションを介してそれを確保しました。このように見えます

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

また、ユーザーと管理者の2つの役割を持つ領域をセットアップしました

管理者のみがそれらにアクセスできるように、すべての方法を確保しました。

今、私は無料を与えたいです PUT /users/{id}GET /users/{id} ユーザーがアクセスできるようにする方法 自分の彼ら自身だけ 資力。

例:

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

注釈を介してこれを構成する方法が見つからなかったため、HTTP要求を対応するメソッドに渡して、ユーザーがリソースにアクセスできるかどうかを確認することを考えています。

それはこのように見えるでしょう GET /users/{id} 方法:

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

私はこのアプローチが好きではありません。 userID セッションのマニュアル。

  • これを解決するためのよりエレガントな方法を知っていますか?

  • そうでない場合は、フォーム認証を使用している間にユーザーIDをセッションに追加するにはどうすればよいですか?

編集

ありがとうウィルとパベル:)これが私の最後の解決策です:

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

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top