播放剪影未将密码插入数据库表
Posted
技术标签:
【中文标题】播放剪影未将密码插入数据库表【英文标题】:play silhouette is not inserting password into database table 【发布时间】:2016-10-15 18:17:00 【问题描述】:我正在使用play silhouette 4.0.0-BETA4
。除了存储密码外,一切似乎都正常。每次我尝试注册新用户时,都会输入所有详细信息,但密码似乎存储在passwordinfo
表中。
我正在使用 mysql 数据库。
我花了几个小时试图找出问题所在,但我无法弄清楚。
build.sbt
"com.mohiva" %% "play-silhouette" % "4.0.0-BETA4",
"com.mohiva" %% "play-silhouette-persistence-memory" % "4.0.0-BETA4",
"com.mohiva" %% "play-silhouette-password-bcrypt" % "4.0.0-BETA4",
"com.mohiva" %% "play-silhouette-testkit" % "4.0.0-BETA4" % "test"
注册控制器
val user = User(
None,
userID = UUID.randomUUID(),
loginInfo = loginInfo,
firstName = Some(data.firstName),
lastName = Some(data.lastName),
fullName = Some(data.firstName + " " + data.lastName),
email = Some(data.email),
avatarURL = None
)
for
avatar <- avatarService.retrieveURL(data.email)
user <- userService.save(user.copy(avatarURL = avatar))
authInfo <- authInfoRepository.add(loginInfo, authInfo)
authenticator <- silhouette.env.authenticatorService.create(loginInfo)
token <- silhouette.env.authenticatorService.init(authenticator)
yield
silhouette.env.eventBus.publish(SignUpEvent(user, request))
silhouette.env.eventBus.publish(LoginEvent(user, request))
Ok(Json.obj("token" -> token))
这里authInfoRepository.add
应该在数据库中添加密码。
我尝试调试authInfoRepository
的add
函数,它似乎让我进入DelegableAuthInfoRepository.scala
中的add
函数。这是函数:
override def add[T <: AuthInfo](loginInfo: LoginInfo, authInfo: T): Future[T] =
daos.find(_.classTag.runtimeClass == authInfo.getClass) match
case Some(dao) => dao.asInstanceOf[AuthInfoDAO[T]].add(loginInfo, authInfo)
case _ => throw new ConfigurationException(AddError.format(authInfo.getClass))
我使用 IntelliJ 评估 daos.find(_.classTag.runtimeClass == authInfo.getClass)
,它似乎给了我一个我无法理解的错误(错误是:Could not evaluate due to a change in a source file
;此错误仅在使用 IntelliJ 评估时出现,日志中没有其他内容)。如果我尝试继续执行,它会转到case Some
行。如果我继续,调试器将返回daos.find
行。我试图从case Some
行检查add
函数的实现,它似乎只找到与内存数据库相关的内容:InMemoryAuthInfoDAO.scala
。
我不确定问题是否来自这里,但我真的不明白为什么它没有添加密码并且其他一切都按预期工作。
我使用的代码取自 Silhouette 网站的一些示例。我对安全性了解不多。
如果还有什么遗漏的,请告诉我。
【问题讨论】:
“它似乎给了我一个我无法理解的错误”你介意分享一下吗? 我将它添加到我的初始帖子中。也在这里Could not evaluate due to a change in a source file
。未对来源进行任何更改。
不确定这是否有帮助,但查看一些示例,我发现 DAO 是在配置 DI 期间设置的。也许你没有改变这一点。见github.com/mohiva/play-silhouette-seed/blob/master/app/modules/…
我使用了 Angular 种子项目,似乎他们将其更新为更新版本。这是种子:github.com/mohiva/play-silhouette-angular-seed。问题是通过将剪影更新到最新版本并使用完全相同的模块配置(通知bind[DelegableAuthInfoDAO[PasswordInfo]].toInstance(new InMemoryAuthInfoDAO[PasswordInfo])
)我在编译时收到以下错误:
SilhouetteModule.scala:192: Cannot generate a config value reader for type Option[Option[Seq[com.mohiva.play.silhouette.api.util.RequestPart.Value]]], because value readers cannot be auto-generated for types with type parameters. Consider defining your own ValueReader[Option[Option[Seq[com.mohiva.play.silhouette.api.util.RequestPart.Value]]]]
。我使用的最新版本的剪影也有 InMemoryAuthInfo 的实现,这个版本没有。
【参考方案1】:
我解决了一个类似的问题。我添加了这一行。
/** SilhouetteModule.scala */
import net.ceedubs.ficus.readers.EnumerationReader._
希望对你有帮助:D
【讨论】:
在SilhouetteModule.scala:192: Cannot generate a config value reader for type Option[Option[Seq[com.mohiva.play.silhouette.api.util.RequestPart.Value]]], because value readers cannot be auto-generated for types with type parameters. Consider defining your own ValueReader[Option[Option[Seq[com.mohiva.play.silhouette.api.util.RequestPart.Value]]]]
上仍然遇到同样的错误。它说问题可能是由configuration.underlying.as[JWTAuthenticatorSettings]("silhouette.authenticator")
的参数引起的【参考方案2】:
我知道这为时已晚。但是,它可能会帮助某人。解决方案是制作您自己的扩展 DelegableAuthInfoDAO 的类。正如 SilhouetteModule 中所说,它默认使用 InMemmoryAuthInfoDAO 类。
// Replace this with the bindings to your concrete DAOs
bind[DelegableAuthInfoDAO[GoogleTotpInfo]].toInstance(new InMemoryAuthInfoDAO[GoogleTotpInfo])
// this line has been changed to persist passwords in a DB
bind[DelegableAuthInfoDAO[PasswordInfo]].toInstance(new DBAuthDAO)
// this line has been changed to persist passwords in a DB
bind[DelegableAuthInfoDAO[OAuth1Info]].toInstance(new InMemoryAuthInfoDAO[OAuth1Info])
bind[DelegableAuthInfoDAO[OAuth2Info]].toInstance(new InMemoryAuthInfoDAO[OAuth2Info])
bind[DelegableAuthInfoDAO[OpenIDInfo]].toInstance(new InMemoryAuthInfoDAO[OpenIDInfo])
此代码块位于 SilhouetteModule.scala
【讨论】:
以上是关于播放剪影未将密码插入数据库表的主要内容,如果未能解决你的问题,请参考以下文章