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
}
パスワードをデータベースに暗号化して保存 (サインアップ) するとき、パスワードを暗号化する必要があるかどうかがわかりません。
しかし、以下のように find メソッドで (データベースからの) user.password の代わりに "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 プロバイダーのエントリ ポイントは次の 2 つだと思います。
プロバイダのエントリ ポイント
GET /authenticate/:provider securesocial.controllers.ProviderController.authenticate(プロバイダー)
POST /authenticate/:provider 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;