このトリックは、フォームログインと1つのファイアウォールで2つの分離したエントリを持つことですFacebookのログイン用。しかし私のケースでは、ユーザーが自分の資格情報を使用してログインするか、Facebook接続をクリックしてFOSFacebookBundle
を使用してFacebook OAuth2 API経由で認証することができる単一のログインURLがあります。ここでは、この作品を作るために私の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プロバイダの後に定義されている場合は、別のプロバイダを試します。
ユーザーが保護されたURL(access_control)にアクセスしようとすると、Facebookのログインページが表示され、認証され、サイトにリダイレクトされ、Cookieが検出され、ユーザーが認証されますFOSFacebookBundle
によって正常に完了しました。手動で認証プロセスを開始するには、サイトにfacebook接続ボタンを配置してから、javascriptでユーザーをサイトの別のページにリダイレクトします。このようにして、クッキーは接続ボタンによって設定され、FOSFacebookBundle
は次のリクエストで彼を認証します。私がやっているのは、facebook connectボタンが成功したときにjavascriptのfacebookのlogin_checkパスにユーザをリダイレクトすることです。このようにして、セキュリティ機構は、セキュリティ設定で示されている場所にリダイレクトします。
私はこれがあなたが望むものを達成するのに役立つことを願っています。何か不明な点がある場合は、さらに質問をしてください。
実際にフォローアップ#1
@それは有効なオプションではありませんので、ファイアウォールの構成のノードpublic
下fos_userbundle
を置くことはできません。文字列fos_userbundle
は、FOSUserBundle
UserProviderクラスを参照するために使用されます。私はこのバンドルを使用したことはありませんでしたが、ドキュメントを読む場合は、form_login
を使用してください。 FOSUserBundle
のドキュメントをStep #5以下で見ることができます。あなたが言及したエラーは、login_path
がファイアウォールで処理されていないが、ファイアウォールが/
(^/
)で始まるものと一致しているので、奇妙なことです。何がうまくいかないのか分かりませんが、あなたは正しい方向に進んでいます。 form_login
を使用し、そこから機能しない理由を調べてみてください。それはサービスのために不足しているオプションを充電するので、それが重要だ
factories:
- "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml"
:
よろしく、
マット
見したい場合FOSUserBundleとFOSFacebookBundleの両方を実装簡単な例のバンドルがあります。 – Matt