我需要有一个单独的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)
这很重要,因为它会收取服务缺失的选项.
诀窍是在防火墙中设置两个独立的条目,一个用于表单登录,一个用于 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并尝试检查为什么它不起作用。
问候,
马特
| 归档时间: |
|
| 查看次数: |
3559 次 |
| 最近记录: |