2

PlayFramework(バージョン2.5)での承認の考え方を理解するのに苦労しています。私の状況は、私はREST APIメソッドgetUserを持っていて、私は"X-Authorization"という名前のカスタムリクエストヘッダーに入っているトークンを使って認証を実行してアクセスを制限したいのです。今私のコントローラのコードは以下のようになります。Play Frameworkのメソッドへのアクセス許可の制限 - Java

package controllers; 

import models.User; 
import org.bson.types.ObjectId; 
import play.mvc.*; 
import org.json.simple.*; 
import views.html.*; 

public class ApiController extends Controller { 

    public Result getUser(String userId) { 

     User user = User.findById(new ObjectId(userId)); 
     JSONObject userG = new JSONObject(); 

     //Some code to append data to userG before return 
     return ok(userG.toJSONString()); 
    } 
} 

ルートURLは次のように定義される:1

GET /api/user/:id controllers.ApiController.getUser(id) 

オプションの方法getUser内の認証トークンをチェックし、また、他のかどうかを確認することができ資格情報がありますが、私はアクセスする前にアクセスを制限したいので、getUserメソッドを呼び出します。今後、このREST APIにメソッド呼び出しを追加する予定です。だから私は将来のREST APIにも同じ権限を再利用する予定です。

私が理解できないPlay Frameworkにはauthorizationがあります。

package controllers; 

import models.Site; 
import models.User; 
import org.json.simple.JSONObject; 
import play.mvc.Http.Context; 
import play.mvc.Result; 
import play.mvc.Security; 

public class Secured extends Security.Authenticator { 
    @Override 
    public String getUsername(Context ctx) { 
     String auth_key = ctx.request().getHeader("X-Authorization"); 
     Site site = Site.fineByAccessKey(auth_key); 

     if (site != null && auth_key.equals(site.access_key)) { 
      return auth_key; 
     } else { 
      return null; 
     } 
    } 

    @Override 
    public Result onUnauthorized(Context ctx) { 

     JSONObject errorAuth = new JSONObject(); 
     errorAuth.put("status", "error"); 
     errorAuth.put("msg", "You are not authorized to access the API"); 

     return unauthorized(errorAuth.toJSONString()); 
    } 
} 

は、その後、私は@Security.Authenticated(Secured.class)getUserメソッドに注釈を追加しました:私はこのようなクラスSecurity.AuthenticatorとオーバーライドメソッドgetUserNameonUnauthorizedを拡張することによって認証を実装しようとしました。それは正常に動作し、不正なエラーを返します。しかし今は、それが好ましい方法であるかどうかはわかりません。私はこれが関数のオーバーライドの名前としてそれを行う正しい方法ではないと感じますgetUsernameもそれを示唆しています。私は、リクエストのヘッダーに存在するトークンだけではなく、セッションまたはクッキー内のユーザー名をチェックしていません。

また、承認のために使用されるDeadboltという名前のモジュールがありますが、私はそのドキュメントを読んでおり、それを統合することはできません。私のような初心者にとっては比較的複雑な統合でした。私はそれを使用する方法について混乱していた。私はSubjectPresentコントローラー認可を使用することを考えましたが、それでも正常に実装できませんでした。

最後に、私が実装した方法でSecurity.Authenticatorを使用する必要がありますか?または、getUserの方法で承認を確認している私の最初の選択肢に行くことをお勧めしますか?または誰でも私のシナリオでDeadboltを実装する方法を教えていただけますか?

+0

ただ、 'Security.Authenticated'を実装する方法を知りたい人のために。私は良い助けになるかもしれないいい記事を見つけました:https://alexgaribay.com/2014/06/16/authentication-in-play-framework-using-java/ – Seeker

答えて

2

認証と認証が混在しています。ここで

は良いスレッドです:Authentication versus Authorization

私はこの答えを好き:

認証 =ログイン+パスワード(あなたが誰であるか)

認証 =パーミッション(何許可されている)

認証 == 許可(匿名ユーザーを除く)あなたが知っているすべてのユーザー(つまり、認証ユーザー)

Deadboltの主な目的は、認証(すでに認証されたユーザー)です。あなたの主な目標は認証です。

Pac4J認証 Play用だけでなく、Scala用のJava用のバージョンもあります。良いサンプルプロジェクトがあります:https://github.com/pac4j/play-pac4j-java-demo

私はこのREST APIへのより多くのメソッド呼び出しを追加していく予定将来のように私は私のプロジェクトやタスク

にこのライブラリを自分で使用しています。したがって、私は は、将来のREST APIに同じ承認を再利用するでしょう。 です。

私は単に「application.conf`に設定を追加するように簡単解決:

pac4j.security { 
    rules = [ 
    {"/admin/.*" = { 
     authorizers = "ADMIN" 
     clients = "FormClient" 
    }} 
    ] 
} 

ちょうどセキュリティフィルタを追加することを忘れないでください。この機能はサンプルプロジェクトにありますので、クローンして試してみてください。

別の例フォームthe official page

pac4j.security.rules = [ 
    # Admin pages need a special authorizer and do not support login via Twitter. 
    {"/admin/.*" = { 
    authorizers = "admin" 
    clients = "FormClient" 
    }} 
    # Rules for the REST services. These don't specify a client and will return 401 
    # when not authenticated. 
    {"/restservices/.*" = { 
    authorizers = "_authenticated_" 
    }} 
    # The login page needs to be publicly accessible. 
    {"/login.html" = { 
    authorizers = "_anonymous_" 
    }} 
    # 'Catch all' rule to make sure the whole application stays secure. 
    {".*" = { 
    authorizers = "_authenticated_" 
    clients = "FormClient,TwitterClient" 
    }} 
] 
+0

認証と認可についての説明をありがとう。私はpac4jモジュールを調べます。 – Seeker

関連する問題