Il trucco è di avere due voci separate nel firewall, una per il login del form e una per il login di facebook. Ma nel mio caso, ho un unico URL di accesso in cui l'utente può accedere utilizzando le sue credenziali o fare clic su una connessione Facebook per autenticare tramite l'API OAuth2 di Facebook utilizzando lo FOSFacebookBundle
. Ecco un esempio del mio file security.yml
config per fare questo lavoro:
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]
Ed ecco un esempio del mio file routing.yml
che viene utilizzato per definire le rotte di sicurezza necessarie per fare questo lavoro:
# 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 }
Utilizzando la security.yml
prima, il meccanismo di sicurezza controllerà l'utente che ha effettuato l'accesso usando il modulo prima che l'utente abbia effettuato l'accesso con Facebook. Questo perché l'ordine in cui i provider sono definiti nel chain_provider
. Su ogni richiesta, il FOSFacebookBundle
verifica se è presente un cookie di Facebook oauth2, in tal caso, prova a caricare l'utente. Se non riesce a trovare il cookie, il processo di autenticazione proverà con un altro provider, se definito dopo il provider di Facebook.
Nel tuo caso, quando l'utente tenta di accedere a un URL protetto (in access_control), viene visualizzata la pagina di accesso di Facebook e lui autentica, quindi viene reindirizzato al tuo sito, il cookie viene trovato e l'utente viene autenticato con successo dal FOSFacebookBundle
. Per attivare manualmente il processo di autenticazione, posiziona un pulsante di connessione di Facebook sul tuo sito, quindi, in javascript, reindirizza l'utente a un'altra pagina del tuo sito. In questo modo, il cookie verrà impostato dal pulsante Connetti e lo FOSFacebookBundle
lo autenticherà alla successiva richiesta. Quello che faccio, è di reindirizzare l'utente al percorso login_check per facebook in javascript quando il pulsante facebook connect ha avuto successo. In questo modo, il meccanismo di sicurezza lo reindirizzerà dove è indicato nella configurazione di sicurezza.
Spero che questo ti aiuterà a ottenere ciò che desideri. Non esitare a fare ulteriori domande se qualcosa non è chiaro.
@ Follow-up # 1
In effetti, non si può mettere fos_userbundle
sotto il nodo public
nella configurazione del firewall perché non è un'opzione valida.La stringa fos_userbundle
viene utilizzata per fare riferimento alla classe UserProvider FOSUserBundle
. Non ho mai usato questo pacchetto ma leggendo la documentazione, dovresti usare form_login
. È possibile consultare la documentazione di FOSUserBundle
in Step #5 e di seguito. L'errore che hai citato è strano perché ti dice che il login_path
non è gestito dal firewall ma è il caso dal momento che il firewall corrisponde a qualsiasi cosa che inizia con un /
(^/
). Non sei sicuro di cosa stia andando male, ma stai andando nella giusta direzione. Usa form_login
e prova a controllare perché non funziona da lì.
saluti,
Matt
ho aggiunto un follow-up alla mia risposta. – Matt