2012-03-11 66 views
8

我正在爲Symfony2設計一個相對簡單的登錄系統。使用第三個參數自定義登錄

我有基礎知識,工作得很好。

是什麼讓這有點特別是我需要一種方式來提供第三個值(生態系統的價值)。我的數據庫中的用戶名不是唯一的,而是與生態系統值構成唯一對。

生態系統價值由它們登錄的表單提供。

如何在執行登錄時將此生態系統的價值納入考慮範圍?

回答

6

看看How to load Security Users from the Database (the Entity Provider)上的食譜教程 - 特別是關於Authenticating Someone with a Custom Entity Provider的部分。

本部分介紹如何更改/創建UserProviderInterface以允許通過電子郵件地址或用戶名登錄。顯然,這不是你想要的,但是 - 修改代碼以查詢/驗證你的第三個登錄參數應該是相對簡單的。

理想情況下,您可能會想要創建自己的UserProvider,幸運的是,有一個烹飪教程僅供參考:How to create a custom User Provider


更新:要具有處理和傳遞給您的自定義提供商(在上面創建)第三登錄選項,您還需要創建一個自定義身份驗證提供者。看看How to create a custom Authentication Provider(另一本)的食譜文章。本文專爲處理額外的請求標頭參數進行身份驗證而設計,但使用此示例,您應該能夠爲請求POST值交換出請求標頭。

使用Cookbook文章瞭解如何使用Symfony2進行身份驗證,但使用(並擴展)Symfony2的用戶名/密碼功能,並且只包含第三個參數。有些類查看:

+0

我已經有這兩個實施。我無法弄清楚的是如何獲得第三個值到我的倉庫以驗證它。 – samanime 2012-03-12 00:23:52

+0

@samanime:我已經更新了我的答案,希望它能提供一些幫助!如果你什麼都不做,看看並且模仿我發佈了一個鏈接到的'UsernamePasswordFormAuthenticationListener'類。祝你好運! – leek 2012-03-12 04:00:04

+0

那麼,這是很多工作,但我終於明白了。我必須實現自己的身份驗證偵聽器,身份驗證提供程序,令牌和工廠。我擴展了其中大部分的UsernamePassword版本,所以我不必重新實現它已有的安全性內容。 我也找不到一種方法來獲得第二個值到一個EntityRepository中,所以我不得不在第一個參數中傳遞一個數組來獲得我需要的內容。不理想,但它的工作原理。 – samanime 2012-03-12 07:52:35

0

您可以創建自定義Password Authenticator(> = Symfony的2.6),並在其中設置屬性:

  1. createToken ():創建令牌(您可以使用UsernamePasswordToken)並將屬性設置爲i t,從$ request中獲取所需的數據。
  2. authenticateToken():在這裏你用第三個變量($ token-> getAttribute())做一些事情。如果它影響下面讀取的loadUserByUsername。

在authenticateToken()中,您有UserProvider和loadUserByUsername。我所做的是使用my user provider(它擴展了FOSUserBundle並覆蓋了上述方法),並使用用戶名和其他所需數據將數組傳遞給它。不要忘記檢查loadUserByUsername中傳遞的內容(例如,如果它是一個字符串,則調用parent :: loadUserByUsername)。

我相信loadUserByUsername這個技巧是壞的,但我不知道該怎麼辦。