2012-09-06 6 views
5

Abbiamo un sistema in cui gli amministratori e gli utenti standard vengono gestiti dai propri fornitori di sicurezza separati. Ciò ha causato un problema nelle pagine amministrative perché gli amministratori non possono accedere a nessun file o immagine che si trova dietro il firewall del sito principale a meno che non siano anche connessi al sito principale.Symfony 2: Accesso a una rotta firewall con due provider separati

Le immagini e i file devono essere accessibili a tutti gli utenti e amministratori autenticati, indipendentemente dal provider. Sono serviti attraverso un controller che fornisce un controllo di accesso a grana più fine.

È possibile definire più di un provider per consentire l'accesso a una rotta?

Ecco una versione ridotta del nostro security.yml corrente:

security: 
    providers: 
     admin_user_db: 
      entity: { class: OurAdminUserBundle:AdminUser, property: username } 
     site_user_db: 
      entity: { class: OurSiteUserBundle:SiteUser, property: username } 
    firewalls: 
     admin_login: 
      pattern: ^/admin/login$ 
      security: false 
     site_user_login: 
      pattern: ^/login 
      security: false 
     file_route: 
      pattern: ^/file 
      anonymous: ~ 
      ### We need to allow this route only for authorized users from 
      ### either admin_user_db or site_user_db providers 
     admin_secured_area: 
      pattern: ^/admin 
      http_basic: ~ 
      provider: admin_user_db 
      form_login: 
       check_path: /admin/login_check 
       login_path: /admin/login 
      logout: 
       path: /admin/logout 
       target:/
     site_secured_area: 
      pattern: .* 
      http_basic: ~ 
      provider: site_user_db 
      form_login: 
       check_path: /check_login 
       login_path: /login 
       failure_path: /login 
       failure_forward: false 
      logout: 
       path: /logout 
       target:/

risposta

5

Credo che ciò che si cerca è ChainProvider. Questo provider sarà configurato per utilizzare i tuoi due attuali fornitori in modo sequenziale.

Il fornitore di catene tenterà innanzitutto di autenticare l'utente con il primo provider con cui è stato configurato. Se è un successo, l'utente è autenticato. Se si tratta di un errore, il fornitore della catena proverà il successivo e così via fino a quando non sarà possibile provare altri provider.

Ho usato questa tecnica per consentire agli utenti di autenticarsi sia con il login di form che con il login di Facebook. Avevo due fornitori, uno per Facebook, uno per la forma. Quindi, nel mio firewall, il provider era il fornitore della catena e quindi gli utenti erano in grado di accedere con le loro credenziali o con il loro account Facebook.

Dal momento che il fornitore di catene è sequenziale, ciò che suggerisco è di mettere il provider che probabilmente verrà utilizzato più spesso prima.

Ecco un esempio di configurazione presa dal sito della documentazione di Symfony:

security: 
    providers: 
     chain_provider: 
      chain: 
       providers: [in_memory, user_db] 
     in_memory: 
      users: 
       foo: { password: test } 
     user_db: 
      entity: { class: Acme\UserBundle\Entity\User, property: username 

Si può dare un'occhiata al documenation qui:

  1. Using Multiple User Providers

saluti, Matt

+0

Grazie per la risposta, siamo stati in grado di impostare il 'ChainProvider' con queste istruzioni (anche se penso che la sintassi fosse un po 'diversa in la nostra versione di Symfony). Alla fine abbiamo finito con l'abbandonare "AdminUser" e l'utilizzo di ruoli come suggerito da @jperovic, dal momento che ci siamo resi conto che i provider separati non sono realmente necessari nel nostro scenario. – Kaivosukeltaja

1

Avevo una certa esperienza con questo problema e la soluzione era quella che scriveva Matt.

Tuttavia, poiché l'applicazione era protetta da firewall di amministrazione, studenti e docenti, non è stato possibile ottenere una rappresentazione corretta quando necessario. Cioè, gli utenti di Amministrazione potrebbero impersonare gli utenti dal loro firewall e solo da quelli.

Ora, è possibile che ho fatto qualcosa di sbagliato, ma poiché si trattava di un'attività sensibile al fattore tempo, abbiamo deciso di mettere tutto dietro un singolo firewall e lasciare che i diversi ruoli svolgessero il lavoro. Si è rivelata una soluzione molto più semplice, ma alla fine tocca a voi ...

Problemi correlati