私はJerseyを使用してREST Webサービスを作成し、Javaセキュリティーの注釈でセキュリティを保護しました。管理者のみがアクセスできるように、私はすべてのメソッドを確保し、ユーザーと管理者ロールの1人のユーザーだけがRESTリソースにアクセスできるように、RESTリソースを保護する方法を教えてください。
: それは私もセットアップに二つの役割を持つレルムを持っているこの
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
ようになります。
は、今私は、ユーザーが自分自身のとだけ自分のリソースにアクセスできるように、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}
方法のために、このようになります:私はセッションにuserID
てmanualyを追加する必要がと思うので、私はこのaproachを好きではない
@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();
}
。
これを解決するより洗練された方法をご存知ですか?
フォーム認証を使用してセッションにユーザーIDを追加する方法はありませんか?
EDIT
あなたは意志とパベルありがとう:)ここに私の最終的な解決策である:RESTを展開する最も重要な側面の
@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);
}
またはSecurityContextを挿入できます(http:// jerseyを参照)。 java.net/nonav/apidocs/1.11/jersey/javax/ws/rs/core/SecurityContext.html –
ありがとうございましたあなたの洞察が大いに役立ちました。 @Pavelもありがとう私は今SecurityContextを使用しています今素晴らしい:D – Zounadire