У меня проблемы с пониманием идеи авторизации в PlayFramework (версия 2.5). Моя ситуация заключается в том, что у меня есть метод REST API getUser
, и я хочу ограничить его доступ, выполнив авторизацию с помощью токена, который приходит в пользовательском заголовке запроса с именем "X-Authorization"
. Теперь мой код контроллера выглядит так:
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-адрес маршрута определяется следующим образом:
GET /api/user/:id controllers.ApiController.getUser(id)
Вариант 1 может состоять в том, чтобы проверить токен авторизации внутри метода getUser
, а также проверить наличие других учетных данных, но я хочу ограничить доступ даже до того, как он вызовет метод getUser
. В будущем я буду добавлять больше вызовов методов в этот REST API. Поэтому я буду повторно использовать ту же авторизацию и для этих будущих REST API.
Я обнаружил, что в Play Framework доступна авторизация, которую я не могу понять. . Я попытался реализовать авторизацию, расширив класс Security.Authenticator
и переопределив методы getUserName
и onUnauthorized
следующим образом:
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());
}
}
Затем я добавил аннотацию к методу getUser
с помощью @Security.Authenticated(Secured.class)
. Он отлично работает и возвращает несанкционированную ошибку. Но теперь я не уверен, что это предпочтительный способ. Я чувствую, что это неправильный способ сделать это, поскольку название переопределения функции getUsername
также предполагает это. Я не проверяю какое-либо имя пользователя в сеансе или файле cookie, а только токен, присутствующий в заголовке запроса.
Также я знаю, что есть модуль с именем Deadbolt
, который используется для авторизации, но я прочитал его документы, и я не могу его интегрировать. Это была относительно сложная интеграция для новичка вроде меня. Я был в замешательстве о том, как его использовать. Я подумал об использовании SubjectPresent
авторизация контроллера, но я так и не смог ее успешно реализовать.
В конце концов, что вы, ребята, предлагаете, чтобы я использовал Security.Authenticator
так, как я реализовал? Или вы предлагаете мне перейти к моему первому варианту проверки авторизации внутри метода getUser
? Или кто-нибудь может сказать мне, как реализовать Deadbolt
в моем сценарии?
Security.Authenticated
. я нашел следующую хорошую статью, которая может быть хорошей помощью: alexgaribay.com/2014/06/16/ - person Seeker   schedule 23.02.2017