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

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

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

Итак, общий вопрос: есть ли способ настроить папку «Активы», к которой можно получить доступ только в том случае, если пользователь прошел проверку подлинности?

Огромное спасибо

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


person SysHex    schedule 12.01.2015    source источник


Ответы (1)


Как я поступил:

Создайте PrivateAssets, который расширяет AssetsBuilderlike так:

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);
    }
}

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

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, чтобы добавить еще одну папку ресурсов, чтобы иметь две отдельные папки для каждого типа ресурсов. Это доставило мне больше проблем, чем что-либо еще, особенно во время тестирования.

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

person SysHex    schedule 15.01.2015