根据@SergGr 的建议,我使用https://github.com/mohiva/play-silhouette-persistence-reactivemongo模块来实现密码持久性。
该模块的文档展示了如何构造一个 DAO 实例:
val dao = new MongoAuthInfoDAO[PasswordInfo](reactiveMongoApi, config)
原始示例绑定 DAO 如下:
bind[DelegableAuthInfoDAO[PasswordInfo]].toInstance(new InMemoryAuthInfoDAO[PasswordInfo])
很容易将其替换为
bind[DelegableAuthInfoDAO[PasswordInfo]].toInstance(new MongoAuthInfoDAO[PasswordInfo](reactiveMongoApi, config))
并尝试将所需的参数注入为
class SilhouetteModule @Inject() (reactiveMongoApi: ReactiveMongoApi, configuration: Configuration) extends AbstractModule with ScalaModule
这将编译,并且似乎是有道理的。但是,这将导致运行时错误,因为无法执行注入。似乎我们正在尝试在正确设置注入器之前注入一些东西。
解决方案是一起删除此绑定并完全依赖
@Provides
def providePasswordInfoDAO(reactiveMongoApi: ReactiveMongoApi, config: Configuration): DelegableAuthInfoDAO[PasswordInfo] = {
implicit lazy val format = Json.format[PasswordInfo]
new MongoAuthInfoDAO[PasswordInfo](reactiveMongoApi, config)
}
这在文档中,但没有强调您应该使用它而不是尝试自己创建实例。
需要注意的是,该实现创建了一个集合auth.PasswordInfo,如果您尝试在 mongo shell 中使用 来检查它db.auth.PasswordInfo.find(),您将收到错误消息。名称中的点是一个问题,因此您必须使用db["auth.PasswordInfo"].find().