我正在使用Play 2.1和securesocial主快照。
我已经实现了find&保存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方法中使用“password”(String)而不是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)))))
这里我认为它再次尝试加密来自数据库的密码(已加密)...我想,我应该保存密码而不加密,或者获取用户在登录页面输入的密码以便使用在find方法中。任何人都可以帮助我,谢谢。
我认为以下是所有社交网络的两个切入点。 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;
答案 0 :(得分:1)
您需要在某处使用BCrypt.checkpw(suppliedPassword, hashedPassword)
。
所以是的,您应该将散列密码保存到数据库中。然后,当用户在登录屏幕上提供密码时,您应该从数据库中检索用户的哈希密码,调用checkpw,然后如果它返回true,则将用户登录。
答案 1 :(得分: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
}
}
}