Играйте в java-проект с Deadbolt, имея личные активы

Я искал вокруг, чтобы попытаться найти пример того, как настроить папку ресурсов, чтобы к ней обращались через нотацию @rout.Assets, но возвращал актив только в случае аутентификации пользователя.

У меня настроен deadbolt и он отлично работает с учетными записями Google, приложение также работает, но, к сожалению, когда я использую браузер и записываю прямой URL-адрес для ресурсов Javascript, которые используются для части приложения, он позволяет мне загружать их без проблем.

Итак, общий вопрос: есть ли способ настроить папку "Ресурсы", доступ к которой возможен только при аутентификации пользователя?

Спасибо

Edit1: способ, которым я делаю это сейчас, это то, что я создал контроллер с именем PrivateAssets, с методом с именем "at", который принимает путь String и аргументы файла String. Этот метод аннотирован @SubjectPresent, и я иду туда, получаю файл и возвращаю его.

1 ответ

Решение

Как я пошел об этом было:

Создать PrivateAssets это расширяет AssetsBuilderвот так:

public class PrivateAssets extends AssetsBuilder {

    private final static Logger logger = LoggerFactory.getLogger(PrivateAssets.class);

    private static User getLocalUser(final Http.Session session) {
        final AuthUser currentAuthUser = PlayAuthenticate.getUser(session);
        final User localUser = User.findByAuthUserIdentity(currentAuthUser);
        return localUser;
    }

    private static Http.Session session() { return Http.Context.current().session(); }

    private static Http.Request request() { return Http.Context.current().request(); }

    private static Http.Response response() { return Http.Context.current().response();}

    @SubjectPresent
    public static Result at(String path , String file) {
        logger.debug(getLocalUser(session()).email + " -> secure asset call : " + path + " | " + file);
        return Results.ok(Play.application().getFile(path + File.separator + file), true);
    }
}

Я также изменил свой файл маршрутов следующим образом:

GET         /assets/*file                                controllers.Assets.at(path="/public/public", file)
GET         /secure/assets/*file                         controllers.PrivateAssets.at(path="/public/private", file)

мой public папка теперь имеет 2 другие папки внутри:

- public
- private

Внутри публики у меня есть вся структура активов, к которой может иметь доступ любой человек.

Внутри private у меня есть вся структура активов, к которой имеют доступ только аутентифицированные пользователи.

Чтобы получить любой из частных активов, я делаю что-то вроде этого:

<script src="@routes.PrivateAssets.at("private.min.js")"></script>

Были и другие варианты, такие как изменение build.sbt файл, как описано в руководстве по миграции 2.3, чтобы добавить еще одну папку активов, чтобы иметь две отдельные папки для каждого типа активов. Это дало мне больше проблем, чем что-либо еще, особенно во время тестирования.

Надеюсь, что это поможет всем, кто нуждается в подобных вещах.

Другие вопросы по тегам