2013-04-20 3 views
0

Я использую Play 2.1 и securesocial master snapshot.play framework - securesocial реализация пользовательского интерфейса

Я реализовал находку & сейв UserService (простирается UserServicePlugin) следующим образом:

метод Find, как показано ниже:

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 
    } 

При сохранении (регистрация) пароль вводится в базу данных, я не уверен, следует ли его зашифровать или нет, и выше всегда сказано: «Учетные данные введенные вами, недействительны ».

Но если я использую слово «пароль» (String) вместо user.password (из базы данных) в методе находит, как показано ниже его valids учетных данных правильно, и регистрирует меня:

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/аутентификации /: поставщик securesocial.controllers.ProviderController.authenticate (поставщик)

POST/аутентификации /: поставщик securesocial.controllers.ProviderController.authenticateByPost (поставщик)

Я думаю, что эти реализации поставляются с 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; 

ответ

1

Вы должны использовать BCrypt.checkpw(suppliedPassword, hashedPassword) где-нибудь.

Так что да, вы должны сохранить хешированный пароль в базе данных. Затем, когда пользователь поставляет пароль на экране входа в систему, вы должны получить хешированный пароль для пользователя из своей базы данных, вызвать checkpw, затем, если он вернет true, тогда войдите в систему.

+0

'POST/authenticate /: поставщик securesocial.controllers.ProviderController.authenticateByPost (поставщик)' Вышеприведенная строка - это стандартная реализация Authentication of UserPass? Это? Если да, скажете ли вы, если мы обновим или заменим это на вышеупомянутый метод checkpw? – user237865

+3

SecureSocial автоматически выполняет все хеширование. Таким образом, похоже, что ваш метод find() неверен. В вашем коде похоже, что вы хешируете уже хэшированный пароль. Вы должны иметь возможность скопировать демонстрационный проект и при необходимости изменить его, чтобы начать: https: // github.com/jaliss/securesocial/tree/master/samples/scala/demo – sthomps

+0

Я видел образец, они не используют пароль или bcrypt или что-то еще, но я нашел проблему, я пытаюсь снова зашифровать пароль, как 'BCrypt. hashpw (user.password, BCrypt.gensalt (10)) ', который на самом деле должен быть просто' user.password'. Я не знаю, почему я это делал :( Спасибо за обсуждение :) Я очень ценю это. – user237865

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 
     } 
    } 
    } 
Смежные вопросы