2013-02-20 76 views
2

我在Web上尋找了一個用於配置的解決方案,但找不到滿足需求的內容。 到目前爲止,我一直在爲此工作3整天,並且我無法使其正常工作,我確信有幾件事我不明白。不需要UserProvider的自定義身份驗證

我正在開發我的分支2.1上的symfony應用程序。

要做到這一點。我有一個我想用於身份驗證的web服務。

這就是我要實現的流程:

  1. 用戶提交憑據
  2. 這些憑據(用戶名&需要密碼)發送到我的web服務
  3. 如果用戶名/密碼是正確的, webservice爲用戶提供一個數組,用戶名,角色和一些其他的東西,但密碼。 (如果證書不正確,將返回一個字段的數組)
  4. 只要web服務提供「大」數組,我希望用戶被視爲已認證。
  5. 在返回角色的函數中,我希望Symfony安全組件爲用戶提供相應的授權。
  6. 我想避免在瀏覽每個頁面時調用web服務。

我不知道是否有可能使用Symfony做到這一點,當然這個工作流看起來不是更安全,但我看不到另一種使用這個web服務的方式。

要完成,我不需要有UserProvider,因爲我的身份驗證是在遠程服務上進行的。但顯然,Symfony組件需要用戶提供者(不管其類型)。

我感謝你在

編輯:爲了使其更簡單,是有可能傳遞loadUserByUsername不僅僅是變量$ USERNAME更多的東西在UserProvider類(實現UserProviderInterface)()函數?我需要讓用戶通過他/她的用戶名才能檢索用戶對象。

回答

3

AuthenticationProvider通常會調用UserProvider.loadUserByUsername。在你的情況下,不需要調用它。您的身份驗證方法可以負責創建用戶並傳回令牌。

經過身份驗證的令牌最終會在會話中結束。

問題是,默認情況下,當下一個請求進入時,系統將從會話中檢索令牌/用戶,然後調用UserProvider.refreshUser($ user),默認情況下,該用戶重新加載loadUserByUsername 。

因此,您需要創建自己的用戶提供程序,並讓refreshUser返回相同的用戶。你將需要一個loadUserByUsername來滿足接口,但它不應該被調用。

如果您確實想要定期從Web服務中刷新您的用戶,那麼您需要添加自己的偵聽器以從會話中加載令牌並覆蓋默認行爲。