2013-02-19 33 views
4

我使用Play 2.0.4與SecureSocial。我想使用UsernamePasswordProvider將用戶註冊保留爲數據庫如何使用Play 2.0和SecureSocial持續用戶註冊

我對Java和Play框架相對較新,所以我不太確定如何完成這項工作。我創建了一個名爲「User」的簡單模型,但不知道如何離開這裏。

我希望有人可以幫助我,我確信之前已經完成了這項工作。首先十分感謝!

@Entity 
public class User extends Model { 
    // 
} 
+0

我發現這個出發點,它採用油滑:http://blog.lunatech.com/2013/07/04/play-securesocial-slick.html – opyate 2014-02-25 13:21:34

回答

6

假設你已經Play2.0配置爲使用SecureSocial,你可以從這個問題開始:Play SecureSocial Persistance with Java 我設法與一些小的修正的工作:

你需要你的用戶對一些當地的代表注意將用戶信息存儲到持久層。我使用了Ebean和一個簡單的LocalBean。像這樣的東西會做:

package models; 

import java.util.List; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import play.db.ebean.Model; 
import play.data.validation.*; 
import play.data.format.*; 

@Entity 
public class LocalUser extends Model { 

    @Id 
    public String id; 
    public String name; 
    public String email; 
    public String password; 
    public String provider; 
     public String firstName; 
     public String lastName; 

     public static Finder<String, LocalUser> find = new Finder<String, LocalUser (String.class,LocalUser.class); 


/** 
* Retrieve a User using an email. 
*/ 
    public static LocalUser findByEmail(String email) { 
     return find.where().eq("email", email).findUnique(); 
    } 
} 

對於我的Token類我用同樣作爲中提到的問題提出的一個:

package models; 

import java.util.Date; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import play.db.ebean.Model; 

@Entity 
public class LocalToken extends Model { 

    private static final long serialVersionUID = 1L; 

    @Id 
    public String uuid; 
    public String email; 
    public Date createdAt; 
    public Date expireAt; 
    public boolean isSignUp; 
    public static Finder<String, LocalToken> find = new Finder<String, LocalToken>(
     String.class, LocalToken.class 
    ); 
} 

對於UserService,我不得不做出一些小的修正所提到的問題,使之在SecureSocial的新版本,用戶在其中()id屬性被identityId()替換工作:

package services; 


import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.List; 

import org.joda.time.DateTime; 

import models.LocalToken; 
import models.LocalUser; 
import play.Application; 
import play.Logger; 
import scala.Option; 
import scala.Some; 
import securesocial.core.AuthenticationMethod; 
import securesocial.core.Identity; 
import securesocial.core.PasswordInfo; 
import securesocial.core.SocialUser; 
import securesocial.core.IdentityId; 
import securesocial.core.java.BaseUserService; 
import securesocial.core.java.Token; 

public class SqlUserService extends BaseUserService { 

    public SqlUserService(Application application) { 
     super(application); 
    } 

    @Override 
    public void doDeleteExpiredTokens() { 
     if (Logger.isDebugEnabled()) { 
      Logger.debug("deleteExpiredTokens..."); 
     } 
     List<LocalToken> list = LocalToken.find.where().lt("expireAt", new DateTime().toString()).findList(); 
     for(LocalToken localToken : list) { 
      localToken.delete(); 
     } 
    } 

    @Override 
    public void doDeleteToken(String uuid) { 
     if (Logger.isDebugEnabled()) { 
      Logger.debug("deleteToken..."); 
      Logger.debug(String.format("uuid = %s", uuid)); 
     } 
     LocalToken localToken = LocalToken.find.byId(uuid); 
     if(localToken != null) { 
      localToken.delete(); 
     } 
    } 

    @Override 
    //public Identity doFind(UserId userId) { 
    public Identity doFind(IdentityId identityId){ 
     if (Logger.isDebugEnabled()) { 
      Logger.debug(String.format("finding by Id = %s", identityId.userId())); 

     } 
     LocalUser localUser = LocalUser.findByEmail(identityId.userId()); 
     if(localUser == null) return null; 
     SocialUser socialUser = new SocialUser(new IdentityId(localUser.id, localUser.provider),  
      localUser.firstName, 
      localUser.lastName, 
      String.format("%s %s", localUser.firstName, localUser.lastName), 
      Option.apply(localUser.email), 
      null, 
      new AuthenticationMethod("userPassword"), 
      null, 
      null, 
      Some.apply(new PasswordInfo("bcrypt", localUser.password, null)) 
     ); 
     if (Logger.isDebugEnabled()) { 
      Logger.debug(String.format("socialUser = %s", socialUser)); 
     } 
     return socialUser; 
    } 


    @Override 
    public Identity doFindByEmailAndProvider(String email, String providerId) { 
     List<LocalUser> list = LocalUser.find.where().eq("email", email).eq("provider", providerId).findList(); 
     if(list.size() != 1){ 
      Logger.debug("found a null in findByEmailAndProvider..."); 
      return null; 
     } 
     LocalUser localUser = list.get(0); 
     SocialUser socialUser = 
       new SocialUser(new IdentityId(localUser.email, localUser.provider), 
         localUser.firstName, 
         localUser.lastName, 
         String.format("%s %s", localUser.firstName, localUser.lastName), 
         Option.apply(localUser.email), 
         null, 
         new AuthenticationMethod("userPassword"), 
         null, 
         null, 
         Some.apply(new PasswordInfo("bcrypt", localUser.password, null)) 
        ); 
     return socialUser; 
    } 

    @Override 
    public Token doFindToken(String token) { 
     if (Logger.isDebugEnabled()) { 
      Logger.debug("findToken..."); 
      Logger.debug(String.format("token = %s", token)); 
     } 
     LocalToken localToken = LocalToken.find.byId(token); 
     if(localToken == null) return null; 
     Token result = new Token(); 
     result.uuid = localToken.uuid; 
     result.creationTime = new DateTime(localToken.createdAt); 
     result.email = localToken.email; 
     result.expirationTime = new DateTime(localToken.expireAt); 
     result.isSignUp = localToken.isSignUp; 
     if (Logger.isDebugEnabled()) { 
      Logger.debug(String.format("foundToken = %s", result)); 
     } 
     return result; 
    } 

    @Override 
    public Identity doSave(Identity user) { 
     if (Logger.isDebugEnabled()) { 
      Logger.debug("save..."); 
      Logger.debug(String.format("user = %s", user)); 
     } 
     LocalUser localUser = null; 
     //localUser = LocalUser.find.byId(user.id().id()); 
     localUser = LocalUser.find.byId(user.identityId().userId()); 

     if (localUser == null) { 
      Logger.debug("adding new..."); 
      localUser = new LocalUser(); 
      //here was localUser.id = user.id().id(); 
      localUser.id = user.identityId().userId(); 
      localUser.provider = user.identityId().providerId(); 
      localUser.firstName = user.firstName(); 
      localUser.lastName = user.lastName(); 
      localUser.email = user.email().get(); 
      localUser.password = user.passwordInfo().get().password(); 
      localUser.save(); 
     } else { 
      Logger.debug("existing one..."); 
      localUser.id = user.identityId().userId(); 
      localUser.provider = user.identityId().providerId(); 
      localUser.firstName = user.firstName(); 
      localUser.lastName = user.lastName(); 
      localUser.email = user.email().get(); 
      localUser.password = user.passwordInfo().get().password(); 
      localUser.update(); 
     } 
     return user; 
    } 

    @Override 
    public void doSave(Token token) { 
     LocalToken localToken = new LocalToken(); 
     localToken.uuid = token.uuid; 
     localToken.email = token.email; 
     try { 
      SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      localToken.createdAt = df.parse(token.creationTime.toString("yyyy-MM-dd HH:mm:ss")); 
      localToken.expireAt = df.parse(token.expirationTime.toString("yyyy-MM-dd HH:mm:ss")); 
     } catch (ParseException e) { 
      Logger.error("SqlUserService.doSave(): ", e); 
     } 
     localToken.isSignUp = token.isSignUp; 
     localToken.save(); 
    } 
} 

就是這樣。請注意,密碼使用Bcrypt進行散列存儲,因此您需要對您的密碼進行哈希以使其正常工作。使用SecureSocial提供的註冊過程很簡單,獲得散列通行證的最簡單方法很簡單。

希望這會有所幫助。

L.

+0

當我更改9998:服務。 InMemoryUserService爲9998:service.SqlUserService在play.plugins中我得到的插件[service.SqlUserService]無法實例化。 沒有可用的源代碼,這裏是異常堆棧跟蹤: - > java.lang.VerifyError:堆棧映射與異常處理程序中的映射不匹配147 – 2014-04-06 18:28:36

+0

此錯誤來自Play 2.2並且在http:// stackoverflow中解決。COM /問題/ 21497661 /升級到播放框架-2-2-securesocial-問題 – 2014-04-06 18:49:41

1

您需要實現UserService的子類並在play.plugins文件中註冊該插件,以便SecureSocial將其取出。從您的UserService實現中,您將使用您的模型類來保存/查找信息。

有一個示例UserService(在Scala中)可以用作指導的拉取請求:https://github.com/jaliss/securesocial/pull/163

您也可以使用樣本中的InMemoryUserService作爲起點,並將其使用的哈希映射替換爲調用模型對象來保存/檢索事物。

相關問題