ロールの1人のユーザーのみがそれにアクセスできるように、RESTリソースを保護するにはどうすればよいですか?
質問
私はジャージーと一緒にレストウェブサービスを成功させ、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);
}
正しい解決策はありません
所属していません StackOverflow