Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何将持久性添加到播放剪影密码哈希器注册表?_Scala_Playframework_Passwords_Persistence_Silhouette - Fatal编程技术网

Scala 如何将持久性添加到播放剪影密码哈希器注册表?

Scala 如何将持久性添加到播放剪影密码哈希器注册表?,scala,playframework,passwords,persistence,silhouette,Scala,Playframework,Passwords,Persistence,Silhouette,我正在看播放剪影种子示例: 很清楚如何向UserDAO和AuthTokenDAO添加持久性,因为它们有内存实现UserDAOImpl和AuthTokenDAOImpl,您可以覆盖它们并提供数据库实现,如MongoUserDAOImpl和mongouthTokendaoimpl 然而,我对散列密码的存储位置感到困惑。在本例中没有用于此目的的DAO 这是用户提交注册密码的点: 如何将持久性添加到passwordHasherRegistry?您可能不需要将持久性添加到passwordHasherR

我正在看播放剪影种子示例:

很清楚如何向
UserDAO
AuthTokenDAO
添加持久性,因为它们有内存实现
UserDAOImpl
AuthTokenDAOImpl
,您可以覆盖它们并提供数据库实现,如
MongoUserDAOImpl
mongouthTokendaoimpl

然而,我对散列密码的存储位置感到困惑。在本例中没有用于此目的的DAO

这是用户提交注册密码的点:


如何将持久性添加到passwordHasherRegistry?

您可能不需要将持久性添加到
passwordHasherRegistry
PasswordHashErrorRegistry
是一个对象,它包含用于对密码进行散列的当前和历史散列函数列表,以便您可以验证密码


根据持久化散列密码信息的方法,您应该提供
authinformepository
trait的实现。您可以使用将工作委托给的实例。另请参见GitHub存储库,它提供了一些基于Mongo的实现
MongoAthinfodao

基于@SergGr的建议,我使用模块实现了密码持久性

模块的文档说明了如何构造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()

谢谢您的建议。我将看一看您给出的示例,同时我也在看这篇文章:。我希望我能把这些部分放在一起。@sbtpr,如果你仔细看看,你可能会注意到我提到的存储库与你的例子中的
PasswordInfoDao
OAuth1InfoDao
非常相似,但GitHub上的配置似乎更灵活。再次感谢,我成功地使模块工作。我写了一个答案来说明一个人在努力使事情进展的过程中可能犯下哪些蹩脚的错误。
@Provides
def providePasswordInfoDAO(reactiveMongoApi: ReactiveMongoApi, config: Configuration): DelegableAuthInfoDAO[PasswordInfo] = {
  implicit lazy val format = Json.format[PasswordInfo]
  new MongoAuthInfoDAO[PasswordInfo](reactiveMongoApi, config)
}