2013-03-26 48 views
3

我一直在使用Symfony 2.1開發自定義身份驗證系統。很多戰鬥與Symfony的後,我已經得到了一些工作,但不完全...Symfony2自定義身份驗證:用戶已登錄但未通過身份驗證

問題:登錄(通過表單)後,用戶登錄,但沒有通過認證。

上下文:由於用戶必須通過HTML表單提交其憑據,因此我必須創建一個擴展爲AbstractAuthenticationListener的偵聽器。

問題:聽衆不應該自動將令牌添加到SecurityContext嗎?如果情況並非如此,我應該手動進行嗎?

過程

用戶通過HTML表單

監聽截獲請求遞交國書,並運行attemptAuthentication

偵聽器調用的AuthenticationManager的(實現AuthenticationProviderInterface)身份驗證方法

的AuthenticationManager調用UserProvider(實現UserProviderInterface)從我的web服務檢索用戶的數據。

UserProvider返回用戶類實現的UserInterface

AuthenticationManager會創建一個令牌實施TokenInterface。

AuthenticationManager將令牌返回給偵聽器。

聽衆attemptAuthentication收益從AuthenticationManager會的方式令牌:驗證

用戶登錄,但沒有通過認證。

我沒有顯示代碼示例以避免重載帖子。如果需要,我會編輯帖子。

+1

當一切正常工作,所有的聽衆。attemptAuthentication所要做的就是返回經認證的令牌,該令牌又來自authenticationManager.authenticate。不需要在security.context中顯式設置它。第一步是驗證令牌是否被實際驗證,因爲其他各種偵聽器都會進入。經過身份驗證的令牌是UsernamePasswordToken嗎? – Cerad 2013-03-26 18:33:16

+0

經過身份驗證的令牌是authenticationManager.support方法中定義的我的CustomToken實例。 – SupaCoco 2013-03-27 08:19:38

+1

您的流程描述幫助我瞭解了一切的工作流程。我實現了一個基於BorisMorel LdapBundle的自定義身份驗證提供程序,並且您的問題已解答我的所有問題!謝謝!! :) – 2014-07-25 14:18:30

回答

2

我發現我的錯誤...

一旦登錄,AuthenticationSuccessHandler將用戶重定向到我想要的網址。此操作從UserProvider觸發refreshUser。

該功能是硬編碼的,測試用戶與我登錄的用戶不同。一旦該函數返回一個等於存儲在令牌中的用戶,問題就解決了。