如何使用Symfony2中的FOSFacebookBundle通过Facebook制作单独的网址

syn*_*tic 5 php symfony

我需要有一个单独的URL用于普通登录表单(用户名/密码),它已经存在于/ login上,还有一些URL如/ login-via-facebook通过FOSFacebookBundle oauth程序登录.

现在我无法理解如何通过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`
Run Code Online (Sandbox Code Playgroud)

所以,在这一点上它抛出一个异常: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.

小智 7

你检查了你的security.yml:

factories:
    - "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml"
Run Code Online (Sandbox Code Playgroud)

这很重要,因为它会收取服务缺失的选项.


Mat*_*att 4

诀窍是在防火墙中设置两个独立的条目,一个用于表单登录,一个用于 Facebook 登录。但就我而言,我有一个登录 URL,用户可以使用其凭据登录,也可以单击 Facebook 连接以使用FOSFacebookBundle. 这是我的配置文件的示例,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]
Run Code Online (Sandbox Code Playgroud)

这是我的文件示例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 }
Run Code Online (Sandbox Code Playgroud)

使用security.ymlbefore,安全机制将在用户使用 facebook 登录之前检查使用表单登录的用户。这是因为提供程序在chain_provider. 在每个请求中,FOSFacebookBundle检查 facebook oauth2 cookie 是否存在,如果存在,它会尝试加载您的用户。如果找不到 cookie,身份验证过程将尝试另一个提供程序(如果它是在 facebook 提供程序之后定义的)。

在您的情况下,当用户尝试访问受保护的网址(在 access_control 中)时,将显示 facebook 登录页面并进行身份验证,然后他将被重定向到您的网站,找到 cookie 并且用户通过FOSFacebookBundle. 要手动触发身份验证过程,请在您的网站上放置一个 facebook 连接按钮,然后在 JavaScript 中将用户重定向到您网站的另一个页面。这样,cookie 将由连接按钮设置,并将FOSFacebookBundle在下一个请求时对他进行身份验证。我所做的是,当 facebook 连接按钮成功时,将用户重定向到 javascript 中 facebook 的 login_check 路径。这样,安全机制将把他重定向到安全配置中指定的位置。

我希望这能帮助您实现您想要的目标。如果有不清楚的地方,请随时提出进一步的问题。

@后续#1

事实上,您不能将其放在防火墙配置中的fos_userbundle节点下public,因为它不是一个有效的选项。该字符串fos_userbundle用于引用FOSUserBundleUserProvider 类。我从未使用过这个捆绑包,但阅读文档后,您应该使用form_login. FOSUserBundle您可以查看步骤#5及下面的文档 。您提到的错误很奇怪,因为它告诉您login_path防火墙不处理该错误,但事实确实如此,因为防火墙匹配以/( ^/) 开头的任何内容。不确定出了什么问题,但你正朝着正确的方向前进。使用form_login并尝试检查为什么它不起作用。

问候,
马特