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
とオーバーライドメソッドgetUserName
とonUnauthorized
を拡張することによって認証を実装しようとしました。それは正常に動作し、不正なエラーを返します。しかし今は、それが好ましい方法であるかどうかはわかりません。私はこれが関数のオーバーライドの名前としてそれを行う正しい方法ではないと感じますgetUsername
もそれを示唆しています。私は、リクエストのヘッダーに存在するトークンだけではなく、セッションまたはクッキー内のユーザー名をチェックしていません。
また、承認のために使用されるDeadbolt
という名前のモジュールがありますが、私はそのドキュメントを読んでおり、それを統合することはできません。私のような初心者にとっては比較的複雑な統合でした。私はそれを使用する方法について混乱していた。私はSubjectPresent
コントローラー認可を使用することを考えましたが、それでも正常に実装できませんでした。
最後に、私が実装した方法でSecurity.Authenticator
を使用する必要がありますか?または、getUser
の方法で承認を確認している私の最初の選択肢に行くことをお勧めしますか?または誰でも私のシナリオでDeadbolt
を実装する方法を教えていただけますか?
ただ、 'Security.Authenticated'を実装する方法を知りたい人のために。私は良い助けになるかもしれないいい記事を見つけました:https://alexgaribay.com/2014/06/16/authentication-in-play-framework-using-java/ – Seeker