2014-10-03 117 views
0

我的應用程序使用web服務來檢查用戶名和密碼是否正確。我只是給從登錄表單的用戶名和密碼,以簡單的方式是這樣的:使用webservice的Symfony2身份驗證

https://host/check?user=admin&password=12345"

WebService的是另一臺服務器上,它是從應用程序也將通信進行加密才能訪問。

認證後,web服務返回我需要的關於用戶(名稱,電子郵件等)的所有信息,因此,我不保留數據庫中的任何內容

在symfony 1中,這很容易做到,但我發現symfony 2安全組件喜歡使事情複雜化很多。

在symfony 2中實現這種認證的最佳方法是什麼?

謝謝

回答

2

我相信你想要做的是在文檔中有自己的頁面。看看How to create a custom user provider,它可以很好地演示如何使用web服務來驗證用戶身份。

UPDATE:

是的,我分享的鏈接會告訴你如何創建一個用戶提供。這正是你必須做的。在本頁的第一段中,它說:

當用戶提交用戶名和密碼時,認證層會要求配置的用戶提供程序爲給定用戶名返回用戶對象。

所以,你需要創建一個擴展UserInterface一個類,這個類應該有從Web服務返回的所有屬性(也默認情況下,的UserInterface需要一些特性,如用戶名,密碼,鹽和角色,但如果你不使用它們,鹽和角色可以是空白的)。

然後您創建一個實現UserProviderInterface的用戶提供程序。這將使得您在執行登錄時調用功能loadUserByUsername。在這個函數中,你執行你的web服務請求,發送證書。您的請求的響應可以映射到您創建的用戶類。然後你返回你創建的用戶對象和從你的web服務返回的數據。

爲了使Symfony知道您想使用自定義用戶提供程序進行表單登錄,您需要爲您的用戶提供程序創建一項服務。因此,在src/Acme/WebserviceUserBundle/Resources/config/services.yml(可能需要創建該文件),你可以因爲它概述了文檔添加一個服務:

parameters: 
    # path to the user provider you just created 
    webservice_user_provider.class: Acme\WebserviceUserBundle\Security\User\WebserviceUserProvider 

services: 
    webservice_user_provider: 
     class: "%webservice_user_provider.class%" 

一旦你創建了這個服務,那麼你只需要告訴你的表單登錄使用這個定製供應商。在security.yml:

security: 
    providers: 
     webservice: 
      # this id is the name of the service you created 
      id: webservice_user_provider 

另外,如果你的密碼在你的web服務進行加密,您應該確保Symfony的加密用同樣的方式做比較。所以在安全。你可以添加yml

security: 
    encoders: 
     Acme\WebserviceUserBundle\Security\User\WebserviceUser: sha512 # or md5, or others 
+1

這隻顯示如何創建用戶提供者。但是我必須將密碼發送到web服務,並且如果密碼良好,服務將返回用戶數據。所以在我打電話給webservice後,我將不得不認證用戶。我如何跳過symfony步驟的其餘部分? – Daniel 2014-10-08 09:40:18

+0

我更新了答案。您必須創建一個自定義用戶提供者。這是唯一的方法。 – Sehael 2014-10-08 15:32:49

+0

這爲用戶提供編碼密碼,以便symfony可以檢查它是否相同。但我不能這樣做,因爲webservice期望用戶提供的用戶和密碼。我必須像這樣將用戶名和密碼發送到web服務:https:// host/check?user = admin&password = 12345,如果憑證是正確的,Web服務將回復(使用用戶配置文件數據)。 – Daniel 2015-01-07 14:58:06

-1

我有同樣的問題與symfony2,不明白爲什麼這個框架是這樣工作的。通過提供用戶名和密碼來驗證web服務是非常常見的,這是你在symfony2中無法使用的東西。 我通過將用戶名和密碼作爲一個由特殊分隔符(類似## || ##)分隔的連接字符串傳遞給loadUserByUsername() -method來解決此問題。我不記得詳細信息,但不需要修改調用此方法的代碼部分。所以我可以通過提供用戶名和密碼在loadUserByUsername()-方法中調用webservice的身份驗證服務,並在獲取用戶時讓symfony完成剩下的工作。