2011-11-17 32 views
5

使用FOSFacebookBundle我需要有普通登入形式(用戶名/密碼),它已經在/登錄存在一個單獨的URL通過Facebook做出登入一個單獨的網址,以及一些網址像/登錄,通過Facebook的通過FOSFacebookBundle oauth程序登錄。如何Symfony2的

現在我無法理解如何通過URL來觸發OAuth的Facebook的程序,如果我嘗試訪問它在「ACCESS_CONTROL」中列出的URL它才起作用。

在此先感謝!


@Matt,非常感謝你的解釋! 我試圖按照你的答案,但還是有一個問題,我沒有提到,我已經使用FOSUserBundle,

security.yml

providers: 
    chain_provider: 
     providers: [fos_userbundle, fos_facebook] 
    fos_userbundle: 
     id: fos_user.user_manager 
    fos_facebook: 
     id: fos_facebook.auth 

firewalls:  
    public: 
     pattern: ^/ 
     fos_facebook: 
     app_url: "" 
     server_url: "" 
     login_path: /login 
     check_path: /login_check/facebook 
     provider: fos_userbundle 
     fos_userbundle: 
     login_path: /login 
     check_path: /login_check/form 
     provider: fos_userbundle 
     anonymous: true 
     logout: true` 

所以,在這一點上它拋出一個異常:InvalidConfigurationException: Unrecognized options "fos_userbundle" under "security.firewalls.public" ,並且如果我在公共防火牆中將fos_userbundle更改爲form_login(但我應該這樣做嗎?),它會引發異常You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.

+0

我添加了一個後續我的回答一個簡單的例子包。 – Matt

回答

4

訣竅是在防火牆中有兩個單獨的條目,一個用於表單登錄,另一個用於登錄表單爲Facebook登錄。但對我來說,我有一個單一的登錄網址,其中用戶可以登錄使用他的證件或者點擊一個連接Facebook通過使用FOSFacebookBundle Facebook的API的OAuth2認證。在這裏我security.yml配置文件的樣本,使這項工作:

security: 
    factories: 
    - "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml" 

    providers: 
    chain_provider: 
     providers: [acme.form_provider, acme.facebook_provider] 
    acme.form_provider: 
     id: acme.user_provider.form 
    acme.facebook_provider: 
     id: acme.user_provider.facebook 

    firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 

    public: 
     pattern: ^/ 
     fos_facebook: 
     app_url: "your_app_url" 
     server_url: "your_server_url" 
     login_path: /login 
     check_path: /login_check/facebook 
     provider: acme.facebook_provider 
     form_login: 
     login_path: /login 
     check_path: /login_check/form 
     provider: acme.form_provider 
     anonymous: true 
     logout: true 

    role_hierarchy: 
    ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

這裏用來定義,使這項工作所需的安全路線我routing.yml文件的樣本:

# This is defined to let the user log in. The controller for 
    # route display the login form and a facebook connect button 
_security_login: 
    pattern: /login 
    defaults: { _controller: AcmeAcmeBundle:Main:login } 

# This is defined for the form login authentication, 
# no controller is associated with it 
_security_check_form: 
    pattern: /login_check/form 

# This is defined for facebook login authentication, 
# a controller is associated with it but does nothing 
_security_check_facebook: 
    pattern: /login_check/facebook 
      defaults: { _controller: AcmeAcmeBundle:Main:loginCheckFacebook } 

_security_logout: 
    pattern: /logout 
    defaults: { _controller: AcmeAcmeBundle:Main:logout } 

使用security.yml之前,安全機制將檢查用戶是否在用戶使用Facebook登錄之前使用表單登錄。這是因爲提供商在chain_provider中的定義順序。在每個請求上,FOSFacebookBundle檢查是否存在facebook oauth2 cookie,如果存在,它會嘗試加載用戶。如果它找不到cookie,認證過程將嘗試另一個提供者,如果它是在facebook提供者之後定義的。

在你的情況下,當用戶試圖去一個受保護的網址(在access_control中),Facebook登錄頁面顯示並進行身份驗證,然後他被重定向到您的網站,找到cookie並驗證用戶成功通過FOSFacebookBundle。要手動觸發認證過程,請在您的網站上放置一個Facebook連接按鈕,然後在JavaScript中將用戶重定向到您網站的另一個頁面。這樣,Cookie將通過連接按鈕進行設置,並且FOSFacebookBundle將在下一次請求中對其進行身份驗證。我所做的是在facebook連接按鈕成功時,將用戶重定向到javascript中的login_check路徑。這樣,安全機制會將其重定向到安全配置中聲明的位置。

我希望這將幫助你實現你想要的。如果有什麼不清楚的地方,不要現場提出進一步的問題。

@後續#1

事實上,你不能把fos_userbundle節點public下的防火牆配置,因爲它不是一個有效的選項。字符串fos_userbundle用於引用FOSUserBundle UserProvider類。我從來沒有使用這個軟件包,但閱讀文檔,你應該使用form_login。您可以查看的文檔Step #5及以下。你提到的錯誤很奇怪,因爲它告訴你login_path不是由防火牆處理的,但是由於防火牆匹配任何以/^/)開頭的東西,所以是這種情況。不知道發生了什麼問題,但你正朝着正確的方向前進。使用form_login並嘗試檢查它不在那裏工作的原因。

問候,
馬特

+0

非常感謝,我編輯了這個問題,請看看你是否有一些時間。 – synthetic

7

你檢查你的security.yml爲:

factories: 
    - "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml" 

這一點很重要,因爲它會收取一定的服務缺失的選項。

+0

這實際上解決了我的一個錯誤。感謝您在此線程中輸入 – Hezad

1

有它實現既FOSUserBundle和FOSFacebookBundle如果你想看看 https://github.com/ollietb/OhFOSFacebookUserBundle

+0

感謝您發表本文!我使用你的代碼創建了一個完整的Symfony 2.1應用程序:https://github.com/meonkeys/symfony21-dual-auth –

+0

git repo移動了。新網址:https://github.com/meonkeys/symfony2-dual-auth –