播放剪影并没有将密码插入数据库表



我正在使用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"

SignUpController

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应该在数据库中添加密码。

我试着调试authInfoRepositoryadd函数,它似乎让我在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网站上的几个示例。我对安全知识不多。

如果还有什么遗漏,请告诉我。

我解决了一个类似的问题。我加了这行。

/** SilhouetteModule.scala */
import net.ceedubs.ficus.readers.EnumerationReader._

希望有帮助:D

我知道这已经太晚了。但是,它可能会帮助一些人。解决方案是创建自己的类来扩展DelegableAuthInfoDAO。正如SilhouetteModule中所评论的那样,它默认使用InMemoryAuthInfoDAO类。

// 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 中

最新更新