0

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

2 回答 2

1

正确的查找方法如下:

 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
      }
    }
  }
于 2013-04-22T12:41:58.077 回答
1

你需要在BCrypt.checkpw(suppliedPassword, hashedPassword)某个地方使用。

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

于 2013-04-21T03:18:36.973 回答