2012-02-23 7 views
5

私は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); 
} 

答えて

2

HttpServletRequestには、getRemoteUser()またはgetUserPrincipal()を呼び出して、ログインしているユーザーの身元を知ることができます。その後、特定のリソースへのアクセスを特に許可または拒否しているように、続行します。

Blessed Geekは、ステートレスなトランザクションとHTTP認証の使用に関するRESTの側面をより具体的に参照しています。これはRESTアーキテクチャの広い範囲で重要なポイントですが、Java EEアプリケーションに対して使用している認証メカニズムのタイプを指定しないため、特に認証がコンテ​​ナの問題であるため、特定の質問との関連性は低くなりますJava EEでは、アプリケーションの問題ではありません。

基本認証を使用している場合は、HTTPヘッダーを使用して認証と承認を管理しています。フォームベースの認証を使用している場合、コンテナはサーブレットセッションを介してこれを管理しており、サービスはステートフルです(セッションはステートフルなアーティファクトなので)。

しかし、これはあなたの特定の質問に関係していません。

+1

またはSecurityContextを挿入できます(http:// jerseyを参照)。 java.net/nonav/apidocs/1.11/jersey/javax/ws/rs/core/SecurityContext.html –

+0

ありがとうございましたあなたの洞察が大いに役立ちました。 @Pavelもありがとう私は今SecurityContextを使用しています今素晴らしい:D – Zounadire

0

一つは、HTTPヘッダーの役割を理解されクッキー

RESTを実用的にするには、認証フレームワークを導入する必要があります。

読む

GWT and Google Docs API。 Googleの連携ログイン、OAuthのとOpenIDの上に読む

GWT-Platform login + session management

私の説明の一部は、OAuth 2.0より前に投稿された場​​合、古くなっている可能性があります。

+0

こんにちはオタク:あなたの答えに感謝します。たぶん、私の場合は、RESTサービスがAJAX Web-Frontedによってのみ使用されているので、ログインしてからアクセスできるので、ちょっと残念です。回答を読んで、なぜ認証フレームワークが必要なのか分かりませんでした。たぶん私の場合にもう少し洞察し、私を説得するために1つか2つの例を作って、より多くの洞察を与えることができるかもしれません:)。ヘッダーとクッキーポイントに関しては、私はまた、いくつかの明確化が必要かもしれません。 – Zounadire

+0

http://stackoverflow.com/questions/9425884/different-browser-means-a-different-client-from-the-same-machine/9426183#9426183 –

関連する問題