Вкратце: мое приложение использует версию 2.5.1.. Я хочу использовать the Deadbolt authorization system и Slick для доступа к информации о авторизации пользователя в моей базе данных. Как я могу это сделать? Deadbolt сделан специально для Play и Play поставляется с Slick интегрированной вне коробки, так что это должно быть возможным, если не очень легко.Как интегрировать Play (веб-фреймворк), Deadbolt (авторизация) и Slick (доступ к базе данных)
На основании "Integrating Deadbolt" из документации Deadbolt я расширил признак DeadboltHandler
. Его абстрактный метод getSubject()
выглядит как место для запроса базы данных (так говорит the documentation, но без какого-либо примера). Этот метод принимает в качестве аргумента AuthenticatedRequest
и возвращает Subject
, в основном идентификатор пользователя, который был аутентифицирован, а также роли и разрешения (авторизации).
Я застрял, потому что в то время как Play поставляется с Slick integration, документация описывает только, как использовать его с контроллера Play. (Примечания Я хотел сделать эту инъекцию с использованием зависимостей, так как с помощью глобального Lookups является устаревшим и подверженными ошибки)
я успешно использую ригель в моем контроллере, чтобы ограничить доступ к определенным ресурсам, но контроллер кажется, неправильное место для Deadbolt, чтобы делать запросы к базе данных для деталей авторизации (если бы это было, то DeadboltHandler
было бы бесцельным). Определение подписи конструктора контроллера выглядит примерно так (примечания контроллер обращается к базе данных по умолчанию, который хранит веб-контент, а не базы данных авторизации):
class Application @Inject()(
dbConfigProvider: DatabaseConfigProvider,
playConfig: play.api.Configuration,
deadbolt: DeadboltActions
) extends Controller {
Это работает. Однако, как и аннотирования расширение DeadboltHandler
с @Inject
не в состоянии обеспечить Slick доступ к базе данных:
class AuthHandler @Inject()(@play.db.NamedDatabase("auth") dbConfigProvider: DatabaseConfigProvider)
extends DeadboltHandler {
результат будучи
not enough arguments for constructor AuthHandler: (dbConfigProvider: play.api.db.slick.DatabaseConfigProvider)services.AuthHandler.
Unspecified value parameter dbConfigProvider.
Очевидно, Play делает что-то особенное для контроллеров, так что @Inject
аннотации, кое-что из которых мне не хватает. Я предполагаю, что это связано с природой конструирования контроллеров с использованием инжектора, а не для ключевого слова new
, но мой поиск по исходному коду не показал мне, что именно происходит. Если бы я мог найти это, возможно, я мог бы подражать этой технике, чтобы построить DeadboltHandler
.
Я вижу, что в игру входят такие классы, как GuiceInjector и GuiceInjectorBuilder, которые звучат так, как будто они могут быть частью решения, но мои эксперименты пока не показали мне, как и если есть какая-либо документация о том, как использовать их в конкретном контексте расширения DeadboldHandler
, я его не хватает.
Я нашел этот предыдущий вопрос: Scala (Play 2.4.x) How to call a class with @inject() annotation, который кажется очень сверху пункт. К сожалению, несмотря на полдюжины последующих комментариев с оригинального плаката, он еще не принят.Я чувствую, если у меня был ответ на этот вопрос, я бы ответ на этот вопрос, хотя мой вопрос очень конкретно: как использовать Play и ригель и Slick друг с другом (в Scala).
Что больше всего меня озадачивает, так это то, что это похоже на то, что должно быть достаточно общим, чтобы оно было либо упомянуто в документации, либо было спрошено уже о SO. Моя неспособность найти такие ссылки обычно означает, что я делаю что-то настолько уникальное, что никто никогда не имел возможности говорить об этом. Конечно, кажется, что это должно быть достаточно просто, что я с оптимизмом надеюсь, что у меня пропало что-то очень основное, и я с нетерпением жду какой-то доброй души, информирующей меня об этом знании.
Я напишу полный ответ позже, но сейчас вы посмотрите на HTTPS: // может GitHub. com/schaloner/deadbolt-auth0-scala/blob/master/app/security/MyDeadboltHandler.scala # L37 и https://github.com/schaloner/deadbolt-auth0-scala/blob/master/app/security/AuthSupport. scala # L56 - в этом примере вместо базы данных используется внешняя платформа управления идентификационными данными, но вы должны переписать https://github.com/schaloner/deadbolt-auth0-scala/blob/master/app/security/AuthSupport .scala # L105 и использовать большая часть кода как есть. –
Вы раскалываете меня, благословите вас, Стива! Возьмите столько, сколько вам нужно, чтобы написать полный ответ; у вас есть знак правильного ответа, ожидающий вас. –