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