简而言之:我的应用程序使用Play web 框架版本 2.5.1。我想使用Deadbolt 授权系统和Slick来访问我数据库中的用户授权信息。我怎样才能做到这一点? Deadbolt是专门为Play制作的,Play自带了开箱即用的Slick ,所以即使不是很容易,它也应该是可能的。
基于Deadbolt 文档中的“Integrating Deadbolt”,我扩展了这个DeadboltHandler
特性。它的抽象getSubject()
方法似乎是进行数据库查询的地方(文档如是说,但没有任何示例)。该方法接收作为参数 anAuthenticatedRequest
并返回Subject
,基本上是经过身份验证的用户 ID,以及角色和权限(授权)。
我被卡住了,因为虽然 Play 带有Slick 集成,但文档只描述了如何在 Play 控制器中使用它。(注意我想使用依赖注入来做到这一点,因为不推荐使用全局查找并且容易出错)
我成功地在我的控制器中使用Deadbolt来限制对某些资源的访问,但控制器似乎是Deadbolt对授权详细信息进行数据库查询的错误位置(如果是,那DeadboltHandler
将是无目的的)。控制器构造函数签名定义类似于(注意控制器访问存储 Web 内容的默认数据库而不是授权数据库):
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
关键字构造控制器,但是我通过Play源代码的搜索未能告诉我到底发生了什么。如果我能找到它,也许我可以模仿这种技术来构建一个DeadboltHandler
.
我看到 play 带有诸如GuiceInjector和GuiceInjectorBuilder 之类的类,听起来好像它们可能是解决方案的一部分,但是我的实验还没有告诉我如何使用它们,以及是否有任何关于如何在特定中使用它们的文档扩展的上下文DeadboldHandler
,我想念它。
我发现了这个先前的问题:Scala (Play 2.4.x) How to call a class with @inject() annotation,这似乎很重要。不幸的是,尽管原始海报有六条后续评论,但仍未得到答复。我觉得如果我有这个问题的答案,我就会有这个问题的答案,尽管我的问题非常具体:如何相互使用Play和Deadbolt和Slick(在Scala中)。
最让我困惑的是,这似乎应该足够普遍,以至于它要么在文档中被提及,要么已经在 SO 上被询问过。我未能找到任何此类参考资料通常意味着我正在做一些非常独特的错误,以至于没有人有机会谈论它。似乎它应该足够简单,我乐观地希望我错过了一些非常基本的东西,我期待着某个善良的灵魂告诉我这些知识。