2014-06-18 131 views
0

我想在symfony 2.5中構建自定義登錄包。我不想使用FOSUserBundle,因爲我的登錄包將與其他邏輯一起工作。我的邏輯:Symfony:沒有用戶名的用戶登錄(界面限制)?

  1. 用戶可以有多個電子郵件,但只能在主電子郵件。電子郵件將被列在另一個實體(UserEmail)中。外鍵指的是主電子郵件的ID
  2. 用戶必須沒有用戶名或其他名稱才能登錄,他可以使用引用其帳戶的那些人的電子郵件地址(在UserEmail中)
  3. 另一個名爲UserRole的實體將擁有一個帶有角色的UserEntity的外鍵。

我已經創建了我的所有實體:User,UserEmail和UserRole。所以我試圖實現我的SecurityController。但不幸的是有一些限制的我文檔中找到:

爲了使用AcmeUserBundle的一個實例:在 Symfony的安全層用戶類,實體類必須實現 的UserInterface。此接口強制類來實現五個 以下方法

  1. getRoles()
  2. getPassword()
  3. getSalt()
  4. getUsername()
  5. eraseCredential()

所以我的登錄不會包含第4點getUsername(),因爲用戶沒有用戶名。

如何在沒有用戶名的情況下實現我的用戶登錄?

+0

不能使用電子郵件作爲用戶名? –

+0

我不認爲這是一個好主意。在源代碼中將其用戶名命名是完全混淆的,但意味着一封電子郵件。 – user3631654

+0

但你說你沒有用戶名。 –

回答

0

你不能實現getUsername()方法來返回用戶的ID嗎?這樣你可以使用UserInterface。

public function getUsername() 
{ 
    return $this->getId(); 
} 

我和你有同樣的問題。我所有的用戶只需要一個電子郵件和密碼進行連接,我不使用任何用戶名。但我必須實現所有與用戶相關的接口來處理Symfony連接,並使用上述解決方案。

這是誤導性的,當然,在我的代碼我有例如

public function loadByUsername($username) 
{ 
    findBy(array('email' => $username)); 
    .... 
} 

但我認爲這是唯一的解決辦法現在。

+0

symfony將在哪裏使用getUsername() - 方法?也許這會造成麻煩 – user3631654

+0

它使我感到厭惡,使用一些不是它的東西。但如果沒有別的辦法,我必須接受它。這會讓我的代碼很難理解,但是沒問題。 – user3631654

+0

我不知道任何其他方式,但我可能是錯的。例如,Symfony將使用getUsername方法在分析器中顯示當前登錄的用戶。但是我知道當我在我的控制器中執行$ this-> getUser()時,我得到了正確的用戶。 – AlixB

0

,如果你有電子郵件的實體,那麼它必須涉及到用戶實體 的關係是一個從用戶側很多,所以你可以必須在用戶實體持有電子郵件實體 的陣列場如果getUsername()功能,您可以遍歷所有的電子郵件,並返回他們中的任何一個,你要

function getUserName(){ 
    // $Email is an array it will hold the array of email entity 
    // as it is in one to many relationship with User Entity 

    foreach($Emails as $email){ // loop through each email 
    if($email->your_flag_to_identify_primery_username==true){ 
    return $email->email_address; // return that match according to flag set by you 

    } 

進一步您必須編寫自定義的驗證機制這一 link將是對你有用

0

getUsername()並不總是使用username作爲字段名。 也許你可以以此爲例子,這是說明如何使用email爲字段名稱:

public function getUsername() 
{ 
    return $this->email; 
} 

public function getRoles() 
{ 
    return array('ROLE_ADMIN'); 
} 

public function eraseCredentials() 
{ 
} 

public function serialize() 
{ 
    return serialize(array(
     $this->id, 
     $this->email, 
     $this->password, 
     // see section on salt below 
     // $this->salt, 
    )); 
} 

public function unserialize($serialized) 
{ 
    list (
     $this->id, 
     $this->email, 
     $this->password, 
     // see section on salt below 
     // $this->salt 
    ) = unserialize($serialized); 
} 

您也可以使用數組作爲您的用戶名,讓我,如果你使用數組作爲電子郵件的收藏知道。

注意:您仍然可以使用getEmail()在您的實體中返回電子郵件。您可以創建多個不同的函數名稱來返回實體中的相同字段。 ;)

0

爲什麼不使用ID作爲用戶名?它在你的概念中提供了更多的邏輯:一個ID是唯一的,在這段時間內不會改變,除非你手動改變它。您可以在需要時向用戶顯示主電子郵件地址或地址列表。如果你想通過任何獨特的屬性來識別你的用戶,這就是應該使用什麼ID(就像在數據庫世界中唯一的標識符一樣 - 這幾乎是相同的用例)。

實體吸氣的例子:

class User { 
    ... 

    public function getUsername() 
    { 
     return $this->id; 
    } 

    ... 
}