2012-05-09 260 views
0

我正在研究Symfon2,並且我已閱讀文檔,我偶然發現屬於「安全」部分的問題。 我需要一個由我製作的自定義身份驗證提供程序,該提供程序可以在會話中保留該令牌,以便在後續請求中獲取它,並且如果用戶沒有提供正確的憑據,則會將其重定向到登錄表單,如果他提供了一個正確的證書,他將被重定向到另一個頁面。使用AbstractAuthenticationListener實現自定義身份驗證提供程序

1.             [訪問歡迎頁面(保護頁)]

用戶----------------------- --------------------------------> [用戶重定向到登錄表單頁面] ----> [用戶提供錯誤的憑據] -----> [用戶返回到登錄表單頁面]

2.             [訪問歡迎頁面(受保護頁面)]
用戶------------------------------------- -------------------> [用戶重定向到登錄表單頁面] ----> [用戶提供正確的憑據] -------> [用戶訪問到歡迎頁面]

我想讓自定義身份驗證提供程序做一些事情(使用ldap,db ...等驗證用戶),然後提供一個令牌並將其保存到安全上下文中,並且要記住我的登錄表單重定向工作正常(如果用戶憑據錯誤,那麼用戶將被重定向到登錄表單頁面,如果他們是正確的,那麼他將重定向到一個歡迎頁面)。

在食譜中有一篇關於「How to create a custom Authentication Provider」的文章,它正在討論「如何爲WSSE身份驗證創建自定義身份驗證提供程序」。

製品的說明被寫入後來: 一類以上未使用的,AbstractAuthenticationListener類,是一個非常有用的基類,它爲安全擴展提供了通常所需的功能。這包括在會話中維護令牌,提供成功/失敗處理程序,登錄表單URL等等。由於WSSE不需要維護認證會話或登錄表單,因此它不會用於此示例。

在食譜中提到的示例中,使用了ListenerInterface,但它不能用於登錄表單頁面。

如果有人解決這個問題,我將非常感謝您獲得解決方案。如果您想驗證從不是db其他來源的用戶

最好的問候,
達尼

回答

3

我覺得創建自定義身份驗證提供者是沒有必要的。您可以創建自定義用戶提供程序並將其設置在防火牆中。檢查this食譜條目。

編輯

假設你已經創建了一個支持令牌和一個自定義的用戶提供自定義的令牌和定製AuthenticationProviderInterface,創建一個實現AbstractAuthenticationListener類的類並實現attemptAuthentication方法。即g

protected function attemptAuthentication(Request $request) 
{ 
    $param = trim($request->get('parameter', null, true));// auth parameters 

    // other processing 
    // authenticate method ultimatly calls your custom auth provider that supports your custom token. 
    return $this->authenticationManager->authenticate(new YourCustomToken($username, $password, $this->providerKey)); 
} 

檢查執行here。服務定義是再次here

編輯:

有兩件事情,用戶提供商和驗證提供商。用戶提供程序根據用戶對象的唯一字段從數據源加載用戶對象,在此情況下爲用戶名。唯一字段可以是電子郵件或唯一標記。另一方面,身份驗證提供程序使用指定的憑證進行身份驗證,並在驗證後返回相應的令牌。所以它首先從源碼加載用戶對象,在你的情況ldap中。然後使用用戶輸入的密碼檢查該對象的密碼。希望能夠消除你的困惑。

是的,你可以設置你的ldap提供商與防火牆。例如

#app/config/security.yml 
firewalls: 
    main: 
     pattern: ^/ 
     form_login: 
      provider: your_custom_provider 
+0

感謝m2mdas您的回覆,但我需要我的特殊標記添加到安全上下文憑據是否正確,證書並不一定是用戶名/密碼,也許這是一個特殊的號碼,或服務器,用戶,通行證的組合等。 –

+0

查看我編輯的評論。 –

+0

只需提一下,爲什麼我不能僅使用用戶提供程序,因爲我必須實現具有loadUserByUsername($ username)的「UserProviderInterface」,但這會給我唯一的用戶名,並且如果在我的情況下用戶需要提供ldap憑據用戶名/密碼,假設我不驗證用戶/數據庫傳遞,然後使用http://symfony.com/doc/current/cookbook/security/custom_provider.html中的解決方案,因爲我需要用戶/密碼所以我可以使用php的ldap函數來驗證用戶是否存在,如果他/她存在,那麼我可以返回一個有效的令牌。 –

相關問題