【问题标题】:play framework - securesocial userpass implementation游戏框架——securesocial userpass 实现
【发布时间】:2013-04-20 19:17:04
【问题描述】:

我正在使用 Play 2.1 和 securesocial 主快照。

我已经实现了 UserService 的查找和保存(扩展 UserServicePlugin),如下所示:

查找方法如下:

 def find(userId: UserId): Option[Identity] = {
    val user = User.findByUserId(userId);
    user match {
      case Some(user) => {
        val socialUser = new SocialUser(userId, null, null, user.name, Option(user.email), Option(user.photo), AuthenticationMethod("userPassword"), null, null, Some(PasswordInfo(PasswordHasher.BCryptHasher, BCrypt.hashpw(user.password, BCrypt.gensalt(10)))))
        Option(socialUser)
      }
      case None => {
         None
      }
    }
  }

保存方法如下:

 def save(user: Identity): Identity = {
    user.id.providerId match {
      case "facebook" => {

      }
      case "google" => {

      }
      case "twitter" => {
      }

      case "userpass" => {
        val eUser = User.findByEmail(user.id.id) match {
          case Some(eUser) => {
            //Existing User - update only
          }
          case None => {
            val appUser: User = new User(NotAssigned, "student", user.id.providerId, user.fullName, user.id.id, user.passwordInfo.get.password, null, null, null, null, null, "active")
            User.create(appUser)
          }
        }
      }
    }
    user
  }

当保存(注册)密码被加密到数据库中时,我不确定它是否应该被加密,上面总是说“您输入的凭据无效。”

但是,如果我在下面的 find 方法中使用“密码”(字符串)而不是 user.password(来自数据库),它会正确验证凭据,并让我登录:

    val socialUser = new SocialUser(userId, null, null, user.name, Option(user.email), Option(user.photo), AuthenticationMethod("userPassword"), null, null, Some(PasswordInfo(PasswordHasher.BCryptHasher, BCrypt.hashpw("password", BCrypt.gensalt(10)))))

在这里,我认为它再次尝试从数据库中加密密码(已经加密)......我想,我应该在不加密的情况下保存密码,或者获取用户在登录页面中输入的密码以使用在查找方法中。谁能帮帮我,谢谢。

我相信以下是所有社交网络和 UserPass 提供商的两个入口点!

提供者入口点

GET /authenticate/:provider securesocial.controllers.ProviderController.authenticate(provider)

POST /authenticate/:provider securesocial.controllers.ProviderController.authenticateByPost(provider)

我认为这些实现带有securesocial插件?还是应该复制相同?是不是最好的解决方案!!

我正在使用 MySQL,下面是我的表格:

create table t_users (
    id int unsigned not null auto_increment,
    user_type enum('admin', 'user') not null default 'user',
    login_type set('userpass', 'facebook', 'google', 'twitter') not null default 'userpass',
    name varchar(64) not null,
    email varchar(128) null,
    password varchar(128),
    mobile varchar(10) null,
    facebook varchar(64) null,
    google varchar(64) null,
    twitter varchar(64) null,
    photo varchar(128),
    status enum('registered', 'active', 'suspended', 'deleted') not null default 'registered',
    modified timestamp not null,
    last_login timestamp not null,
    primary key (id),
    unique(email),
    unique(facebook),
    unique(google),
    unique(twitter)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

【问题讨论】:

    标签: playframework playframework-2.1 securesocial


    【解决方案1】:

    你需要在某处使用BCrypt.checkpw(suppliedPassword, hashedPassword)

    所以是的,您应该将散列密码保存到数据库中。然后,当用户在您的登录屏幕上提供密码时,您应该从数据库中检索用户的哈希密码,调用 checkpw,然后如果它返回 true,则登录用户。

    【讨论】:

    • POST /authenticate/:provider securesocial.controllers.ProviderController.authenticateByPost(provider) 上面这行是UserPass的默认实现Authentication?是吗?如果是这样,你是说我们应该用上面的 checkpw 方法更新还是替换它?
    • SecureSocial 应该会自动为您完成所有哈希。所以看起来你的 find() 方法是错误的。在您的代码中,您似乎正在散列一个已经散列的密码。您应该能够复制演示项目并根据需要进行修改以开始:github.com/jaliss/securesocial/tree/master/samples/scala/demo
    • 我看到了示例,他们没有使用密码或 bcrypt 或任何东西,但我发现了问题,我正在尝试像 BCrypt.hashpw(user.password, BCrypt.gensalt(10)) 一样再次加密密码,实际上应该只是 user.password我不知道我为什么这样做 :( 感谢您的讨论 :) 我真的很感激。
    【解决方案2】:

    正确的查找方法如下:

     def find(userId: UserId): Option[Identity] = {
        val user = User.findByUserId(userId);
        user match {
          case Some(user) => {
            val socialUser = new SocialUser(userId, null, null, user.name, Option(user.email), Option(user.photo), AuthenticationMethod("userPassword"), null, null, Some(PasswordInfo(PasswordHasher.BCryptHasher, user.password)))
            Option(socialUser)
          }
          case None => {
             None
          }
        }
      }
    

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 2019-04-14
      • 1970-01-01
      • 2011-01-17
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多