播放剪影未将密码插入数据库表

时间:2016-06-14 20:45:05

标签: scala playframework silhouette

我正在使用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应在数据库中添加密码。

我尝试调试add的{​​{1}}函数,它似乎让我在authInfoRepository中找到add函数。这是功能:

DelegableAuthInfoRepository.scala

我使用IntelliJ来评估 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)) } } ,它似乎给了我一个我无法理解的错误(错误是:daos.find(_.classTag.runtimeClass == authInfo.getClass);只有在使用IntelliJ进行评估时才出现此错误,日志)。如果我尝试继续执行,它将转到Could not evaluate due to a change in a source file行。如果我继续,调试器将返回case Some行。我试图从daos.find行检查add函数的实现,似乎只找到与内存数据库相关的内容:case Some

我不确定问题是否来自这里,但我真的不明白为什么它没有添加密码,其他一切按预期工作。

我使用的代码取自Silhouette网站的一些例子。我对安全性知之甚少。

如果还有其他遗漏,请告诉我。

2 个答案:

答案 0 :(得分:7)

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

/** SilhouetteModule.scala */

import net.ceedubs.ficus.readers.EnumerationReader._

希望它有所帮助:D

答案 1 :(得分:0)

我知道这为时已晚。但是,它可能会帮助某人。解决方案是使您自己的类扩展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