2013-04-20 52 views
0

我使用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的(從數據庫)中查找方法像它下面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))))) 

這裏我認爲它再次嘗試從數據庫中加密密碼(已經加密)...我猜,我應該保存密碼而不進行加密,或者在login方法中使用登錄頁面中的用戶輸入的密碼。任何人都可以請幫助我,謝謝。

我相信以下是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 /:provider securesocial.controllers.ProviderController.authenticateByPost(provider)'上面這行是默認實現UserPass的認證?是嗎?如果是這樣,你是說我們應該更新還是用上面的checkpw方法替換它? – user237865 2013-04-21 09:15:43

+3

SecureSocial應該自動爲你做所有哈希。所以它看起來像你的find()方法是錯誤的。在你的代碼中,它看起來像你正在哈希一個已經哈希的密碼。 您應該能夠複製演示項目並根據需要進行修改以便開始使用:https:// github。com/jaliss/securesocial/tree/master/samples/scala/demo – sthomps 2013-04-21 17:06:18

+0

我看到了這個示例,他們沒有使用密碼或bcrypt或任何東西,但是我發現了這個問題,我試圖像'BCrypt一樣再次輸入密碼。 hashpw(user.password,BCrypt.gensalt(10))'實際上應該只是'user.password'我不知道我爲什麼這麼做:( 感謝您的討論:)我真的很感激它。 – user237865 2013-04-22 12:40:45

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 
     } 
    } 
    }