Я использую Play 2.1 и защищенный мастер-снимок.
Я реализовал поиск и сохранение 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
}
При сохранении (регистрации) пароль зашифровывается в базу данных, я не уверен, должен ли он быть зашифрован или нет, и выше всегда говорится: «Введенные вами учетные данные недействительны».
Но если я использую слово «пароль» (строка) вместо 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(провайдер)
POST /authenticate/:provider securesocial.controllers.ProviderController.authenticateByPost(поставщик)
Я думаю, что эти реализации поставляются с безопасным социальным плагином? или надо повторить то же самое? Это лучшее решение!!
Я использую 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;