2014-09-17 12 views
5

Sto lavorando alla creazione di un provider di autenticazione per Symfony 2 che consente agli utenti di autenticarsi con il protocollo di accesso singolo denominato CAS.Symfony2: come ottenere i valori di configurazione del listener di autenticazione in un altro servizio?

My L'ascoltatore di autenticazione si estende da AbstractAuthenticationListener. Uno dei parametri di configurazione è check_path, che è il percorso/percorso che attiva il listener di autenticazione per autenticare la richiesta.

ho bisogno check_path quando costruisco l'URL al server CAS (in modo del server CAS sa dove tornare l'utente a), che è facile, dal momento che mia abitudine Punto di ingresso classe viene passata l'array di configurazione quando è costruito in la mia sicurezza Factory.

La parte più difficile è che ho anche bisogno check_path al di fuori di chi ascolta, come durante l'autenticazione all'interno del mio Authentication Provider classe. Ne ho bisogno perché quando il server CAS invia l'utente indietro all'app, passa un parametro "ticket" che deve essere convalidato. Per convalidarlo, invio una richiesta di ricciolo al server CAS che deve contenere il ticket e l'originale check_path utilizzato.

Come ha scritto questo, mi sono reso conto che avrei potuto ottenere l'URL corrente della richiesta di pagina quando sono all'interno del provider di autenticazione (dal momento che è check_path che fa scattare comunque), ma che sembra fuori, e preferirei ottenere direttamente il valore di configurazione per ricostruire l'URL del servizio. Inoltre non mi aiuta quando voglio usare check_path altrove, come quando si costruisce un URL di disconnessione al server CAS che ha richiesto anche lo check_path.

EDIT: Il metodo di AbstractFactorycreateAuthProvider viene passato sia la configurazione e il contenitore, ma non riesco a modificare nessuno dei miei servizi in qui perché non sono ancora parte del contenitore. Forse se avessi un modo per aggiungere un passaggio del compilatore dopo che i miei servizi sono stati caricati e in qualche modo avere accesso alla configurazione del listener?

risposta

0

Puoi passare check_path come parametro al listener?

Se è definito nella configurazione o parametri di file che si può passare al vostro ascoltatore in questo modo:

your_authentication_listener: 
    class: YourBundle\Listener\AuthenticationListener 
    arguments: ['%check_path%'] 
    tags: 
     ... 

(Se ho capito correttamente.)

+0

'check_path' non è un parametro normale, pertanto non può essere eseguito. È un'opzione di configurazione per il listener di autenticazione (vedere il codice per la classe 'AbstractAuthenticationListener'). – Brian

0

Si può fare %check_path% (o un namespace versione di esso) un parametro 'normale': All'interno di DependencyInjection, ci sono (di default) due classi responsabili per la definizione e il caricamento della configurazione del bundle. Qui puoi anche inserire la tua configurazione nel tuo contenitore dei servizi.

  • DependencyInjection\Configuration è possibile definire quali configurazioni sono disponibili nel vostro pacco, che tipo dovrebbero essere ecc

  • DependencyInjection\YourBundleNameExtension è dove è possibile caricare la configurazione e anche aggiungerli al contenitore di servizi.

Se non lo avete ancora fatto nulla in là, load() -Metodo del vostro estensione dovrebbe essere simile a questo:

public function load(array $configs, ContainerBuilder $container) 
{ 
    $configuration = new Configuration(); 
    $config = $this->processConfiguration($configuration, $configs); 

    $loader = new Loader\YamlFileLoader(
     $container, 
     new FileLocator(__DIR__.'/../Resources/config') 
    ); 
    $loader->load('services.yml'); 
} 

$config tiene configurazione del pacchetto, sotto forma di un array, quindi se abbiamo immaginate il vostro file di configurazione YAML si presenta così:

your_bundle_name: 
    check_path: foo 

tuo $config avrà un aspetto simile:

array('check_path' => 'foo') 

Quindi ora tutto ciò che dovete fare è aggiungere questa configurazione al contenitore. All'interno della vostra load() -Metodo semplicemente aggiungere qualcosa come:

$container->setParameter(
    'my_bundle_name.check_path', 
    $config['check_path'] 
); 

all'interno del vostro services.yml è ora possibile utilizzare %my_bundle_name.check_path% come ogni altro parametro:

my_bundle_name.security.authentication.provider: 
    class: MyBundleName\Security\Core\Authentication\Provider\MyAuthenticationProvider 
    arguments: ['%my_bundle_name.check_path%'] 

Per maggiori dettagli, dare un'occhiata alla documentazione di Symfony [1, 2]

+0

Grazie Iris. Sono consapevole che potrei davvero fare di 'check_path' un normale parametro di configurazione, ma preferirei di no, dal momento che dovrò quindi istruire gli utenti del mio bundle ad indicare il' check_path' sia nella configurazione del bund AND nella configurazione per il provider di autenticazione. – Brian

+0

Non sono del tutto sicuro di aver capito il tuo problema? Il 'check_path' verrebbe impostato nel pacchetto config e quindi passato a qualunque servizio ne avesse bisogno? –

+0

'check_path' è un'opzione di configurazione speciale configurata nel file' security.yml' per un provider di autenticazione. Fondamentalmente, * devo * passarlo attraverso il file 'security.yml', quindi anche impostarlo per la configurazione dei miei bundle non è desiderabile. – Brian