【发布时间】:2016-07-24 09:00:08
【问题描述】:
简而言之:我的应用程序使用 Play web framework 版本 2.5.1。我想使用the Deadbolt authorization system 和Slick 来访问我数据库中的用户授权信息。我怎样才能做到这一点? Deadbolt 是专门为 Play 制作的,而 Play 带有开箱即用的 Slick 集成,因此如果不是很容易,这应该是可能的。
基于 Deadbolt 文档中的 "Integrating Deadbolt",我扩展了 DeadboltHandler 特征。它的抽象getSubject() 方法似乎是进行数据库查询的地方(所以说the documentation,但没有任何示例)。该方法接收AuthenticatedRequest 作为参数并返回Subject,基本上是经过身份验证的用户ID,以及角色和权限(授权)。
我被卡住了,因为虽然 Play 附带 Slick integration,但文档仅描述了如何在 Play 控制器中使用它。 (注意我想使用依赖注入来做到这一点,因为不推荐使用全局查找并且容易出错)
我成功地在我的控制器中使用 Deadbolt 来限制对某些资源的访问,但控制器似乎是 Deadbolt 对授权详细信息进行数据库查询的错误位置(如果是,那么DeadboltHandler 将毫无目的)。控制器构造函数签名定义类似于(注意控制器访问存储 Web 内容的默认数据库而不是授权数据库):
class Application @Inject()(
dbConfigProvider: DatabaseConfigProvider,
playConfig: play.api.Configuration,
deadbolt: DeadboltActions
) extends Controller {
这行得通。但是,使用 @Inject 类似地注释 DeadboltHandler 扩展无法提供对数据库的 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,这似乎非常正确。不幸的是,尽管有六个来自原始海报的后续 cmets,但仍未得到答复。我觉得如果我有这个问题的答案,我就会有这个问题的答案,尽管我的问题非常具体:如何使用 Play 和 Deadbolt 和 彼此光滑(在 Scala 中)。
最让我困惑的是,这似乎应该足够普遍,以至于它要么在文档中被提及,要么已经在 SO 上被问到。我未能找到任何此类参考资料通常意味着我正在做一些非常独特的错误,以至于没有人有机会谈论它。似乎它应该足够简单,以至于我乐观地希望我错过了一些非常基本的东西,我期待着某个善良的灵魂告诉我这些知识。
【问题讨论】:
-
我稍后会写一个完整的答案,但现在你可以看看github.com/schaloner/deadbolt-auth0-scala/blob/master/app/… 和github.com/schaloner/deadbolt-auth0-scala/blob/master/app/… - 这个例子使用外部身份管理平台代替数据库,但是您应该能够重写github.com/schaloner/deadbolt-auth0-scala/blob/master/app/… 并按原样使用大部分代码。
-
你让我失望了,祝福你史蒂夫!只要你需要写一个完整的答案;你有一个正确答案等着你。
标签: scala playframework slick playframework-2.5 deadbolt-2