0

我正在查看 Play Silhouette 种子示例:

https://github.com/mohiva/play-silhouette-seed

很清楚如何添加持久性UserDAOAuthTokenDAO因为它们在内存中实现UserDAOImplAuthTokenDAOImpl您可以覆盖并提供数据库实现,例如MongoUserDAOImplMongoAuthTokenDAOImpl.

但是,我对存储散列密码的位置感到困惑。示例中没有用于此的 DAO。

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

https://github.com/mohiva/play-silhouette-seed/blob/master/app/controllers/SignUpController.scala#L80

val authInfo = passwordHasherRegistry.current.hash(data.password)

如何将持久性添加到 passwordHasherRegistry?

4

2 回答 2

1

您可能不需要将持久性添加到passwordHasherRegistry. passwordHasherRegistry是一个对象,其中包含用于对密码进行哈希处理的当前和历史哈希函数列表,以便您对其进行验证。

根据持久性文档页面来持久化散列密码信息,您应该提供AuthInfoRepository特征的实现。您可以使用DelegableAuthInfoRepository它将工作委托给DelegableAuthInfoDAO. 另请参阅Silhouette Persistence ReactiveMongo GitHub 存储库,它提供了一些基于 Mongo 的实现MongoAuthInfoDAO

于 2017-05-29T13:09:35.213 回答
0

根据@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().

于 2017-05-30T15:14:22.647 回答