Play Framework 2.7 Авторизация Получить пользователя - PullRequest
1 голос
/ 16 марта 2019

Я пытаюсь добавить авторизацию в API отдыха, который я встроил в Play 2.7. Я нашел хороший пример для более старых версий игры здесь , но у меня нет доступа к контексту Http, поэтому я не могу добавить пользователя в качестве аргумента.

Есть ли другой способ сделать это в Play 2.7 без доступа к контексту?

public class Secured extends Security.Authenticator {

    @Override
    public String getUsername(Context ctx) {
        String[] authTokenHeaderValues = ctx.request().headers().get(SecurityController.AUTH_TOKEN_HEADER);
        if ((authTokenHeaderValues != null) && (authTokenHeaderValues.length == 1) && (authTokenHeaderValues[0] != null)) {
            User user = models.User.findByAuthToken(authTokenHeaderValues[0]);
            if (user != null) {
                ctx.args.put("user", user);
                return user.getEmailAddress();
            }
        }

        return null;
    }

    @Override
    public Result onUnauthorized(Context ctx) {
        return unauthorized();
    }
}

Я хочу иметь возможность получить пользователя от других контроллеров, как это было сделано в контроллере Todo.

Редактировать: Мой вопрос сводится к тому, где вы храните аутентифицированного пользователя в Play 2.7, так как Http.Context устарел?

1 Ответ

0 голосов
/ 19 марта 2019

Вы можете использовать Состав действия

https://www.playframework.com/documentation/2.7.x/JavaActionsComposition#Passing-objects-from-action-to-controller

public class Attrs {
    public static final TypedKey<User> USER = TypedKey.<User>create("user");
}

public class PassArgAction extends play.mvc.Action.Simple {
    public CompletionStage<Result> call(Http.Request req) {
        return delegate.call(req.addAttr(Attrs.USER, User.findById(1234)));
    }
}

В контроллере:

@With(PassArgAction.class)
public static Result passArgIndex(Http.Request request) {
    User user = request.attrs().get(Attrs.USER);
    return ok(Json.toJson(user));
}

Я также буду рекомендовать вам:посмотрите на pac4j .Имеется плагин для игровой рамки:

https://github.com/pac4j/play-pac4j

https://github.com/pac4j/play-pac4j-java-demo

...