我正在爲Symfony2設計一個相對簡單的登錄系統。使用第三個參數自定義登錄
我有基礎知識,工作得很好。
是什麼讓這有點特別是我需要一種方式來提供第三個值(生態系統的價值)。我的數據庫中的用戶名不是唯一的,而是與生態系統值構成唯一對。
生態系統價值由它們登錄的表單提供。
如何在執行登錄時將此生態系統的價值納入考慮範圍?
我正在爲Symfony2設計一個相對簡單的登錄系統。使用第三個參數自定義登錄
我有基礎知識,工作得很好。
是什麼讓這有點特別是我需要一種方式來提供第三個值(生態系統的價值)。我的數據庫中的用戶名不是唯一的,而是與生態系統值構成唯一對。
生態系統價值由它們登錄的表單提供。
如何在執行登錄時將此生態系統的價值納入考慮範圍?
看看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的用戶名/密碼功能,並且只包含第三個參數。有些類查看:
您可以創建自定義Password Authenticator(> = Symfony的2.6),並在其中設置屬性:
在authenticateToken()中,您有UserProvider和loadUserByUsername。我所做的是使用my user provider(它擴展了FOSUserBundle並覆蓋了上述方法),並使用用戶名和其他所需數據將數組傳遞給它。不要忘記檢查loadUserByUsername中傳遞的內容(例如,如果它是一個字符串,則調用parent :: loadUserByUsername)。
我相信loadUserByUsername這個技巧是壞的,但我不知道該怎麼辦。
我已經有這兩個實施。我無法弄清楚的是如何獲得第三個值到我的倉庫以驗證它。 – samanime 2012-03-12 00:23:52
@samanime:我已經更新了我的答案,希望它能提供一些幫助!如果你什麼都不做,看看並且模仿我發佈了一個鏈接到的'UsernamePasswordFormAuthenticationListener'類。祝你好運! – leek 2012-03-12 04:00:04
那麼,這是很多工作,但我終於明白了。我必須實現自己的身份驗證偵聽器,身份驗證提供程序,令牌和工廠。我擴展了其中大部分的UsernamePassword版本,所以我不必重新實現它已有的安全性內容。 我也找不到一種方法來獲得第二個值到一個EntityRepository中,所以我不得不在第一個參數中傳遞一個數組來獲得我需要的內容。不理想,但它的工作原理。 – samanime 2012-03-12 07:52:35