簡単に言うと、私のアプリケーションはPlay ウェブ フレームワークバージョン 2.5.1 を使用しています。Deadbolt 認証システムとSlickを使用して、データベース内のユーザー認証情報にアクセスしたいと考えています。これどうやってするの? DeadboltはPlay用に特別に作成されており、Playにはすぐに使用できるSlickが組み込まれているため、非常に簡単ではないにしても可能であるはずです。
Deadbolt ドキュメントの「Integrating Deadbolt」に基づいて、トレイトを拡張しましたDeadboltHandler
。その抽象getSubject()
メソッドは、データベースクエリを実行する場所のようです (ドキュメントにはそう書かれていますが、例はありません)。そのメソッドは、引数として を受け取り、基本的には認証されたユーザー ID と、ロールおよびパーミッション (承認)AuthenticatedRequest
を返します。Subject
Play にはSlick integrationが付属していますが、ドキュメントには Play コントローラー内からの使用方法しか記載されていないため、行き詰まっています。(グローバルルックアップの使用は推奨されておらず、エラーが発生しやすいため、依存性注入を使用してこれを行いたいことに注意してください)
コントローラーでDeadboltを使用して特定のリソースへのアクセスを制限することに成功していますが、Deadbolt が承認の詳細についてデータベース クエリを実行するには、コントローラーが不適切な場所のようです(そうであれば、目的がありDeadboltHandler
ません)。コントローラー コンストラクターの署名定義は次のようになります (コントローラーは、承認データベースではなく、Web コンテンツを格納する既定のデータベースにアクセスすることに注意してください)。
class Application @Inject()(
dbConfigProvider: DatabaseConfigProvider,
playConfig: play.api.Configuration,
deadbolt: DeadboltActions
) extends Controller {
それはうまくいきます。DeadboltHandler
ただし、同様に拡張機能に注釈を付けても、データベースへのSlick@Inject
アクセスを提供できません。
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
キーワードではなくインジェクターを使用してコントローラーを構築するという性質上だと思いますが、 Playのソース コードを検索しても、正確に何が起こっているのかを示すことができませんでした。もし私がそれを見つけることができれば、おそらくそのテクニックを模倣してDeadboltHandler
.
play にはGuiceInjectorやGuiceInjectorBuilderなどのクラスが付属しているように見えますが、これらはソリューションの一部であるかのように聞こえますが、私の実験ではまだ方法を示すことができず、特定の用途でそれらを使用する方法に関するドキュメントがある場合拡張機能のコンテキストDeadboldHandler
、私はそれがありません。
この前の質問を見つけました: Scala (Play 2.4.x) How to call a class with @inject() 注釈、これは非常に適切なようです。残念ながら、元の投稿者から 6 件のフォローアップ コメントが寄せられていますが、まだ回答がありません。その質問に対する答えがあれば、この質問に対する答えがあると思いますが、私の質問は非常に具体的です: PlayとDeadboltとSlickを相互に使用する方法 ( Scalaで)。
私を最も困惑させているのは、これがドキュメントで言及されているか、すでに SO で質問されているほど一般的であるべきもののように思われることです。私がそのような参考文献を見つけられなかったということは、通常、私が非常に独特な間違ったことをしていることを意味し、他の誰もそれについて話す機会がありませんでした. それは確かに、私が非常に基本的な何かを見逃していることを楽観的に望んでいるほど単純であるべきであるかのように思われます.