2012-05-07 8 views
5

Sto utilizzando Symfony 2 per creare un sito web.Symfony 2 - nasconde l'intero sito Web con una finestra di dialogo di autenticazione HTTP

Il lavoro è in corso (quindi non voglio che utenti o motori di ricerca accedano ad esso) ma il mio cliente vuole vedere i miei progressi. Stavo pensando che una soluzione facile era quella di proteggere l'intero sito web con l'autenticazione HTTP utilizzando il meccanismo fornito dalla funzionalità di sicurezza di Symfony 2.

Sto utilizzando FOSUserBundle poiché il sito Web avrà utenti che devono registrarsi e accedere.

Questo è il mio security.yml, che funziona alla grande:

security: 
    providers: 
     fos_userbundle: 
      id: fos_user.user_manager 

    encoders: 
     "FOS\UserBundle\Model\UserInterface": sha512 

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
      logout:  true 
      anonymous: true  

    access_control: 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin/, role: ROLE_ADMIN } 
     - { path: ^/account, role: IS_AUTHENTICATED_FULLY } 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

quindi stavo cercando di aggiungere qualcosa su di esso, per consentire al sito web per essere protetti da autenticazione HTTP.
Ho cambiato il file:

security: 
    providers: 
     fos_userbundle: 
      id: fos_user.user_manager 
     whole_website_provider: 
      users: 
       ryan: { password: ryanpass, roles: 'ROLE_USER' }   

    encoders: 
     "FOS\UserBundle\Model\UserInterface": sha512 

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
      logout:  true 
      anonymous: true 
     whole_website: 
      pattern: ^/ 
      anonymous: ~ 
      http_basic: 
       realm: "Secured Demo Area"  

    access_control: 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin/, role: ROLE_ADMIN } 
     - { path: ^/account, role: IS_AUTHENTICATED_FULLY } 
     - { path: ^/, role: ROLE_USER } 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

Fondamentalmente ho aggiunto il fornitore whole_website_provider, il firewall whole_website e un extra access_control.
Ma questo non ha funzionato: quando accedo al sito web, vengo reindirizzato al modulo di accesso, il gioco è fatto.

Hai qualche idea se posso farlo e come?

N.B .: Preferirei non utilizzare alcuna funzione Apache per questo.

+1

Cosa succede se prima metti il ​​firewall 'whole_website'? Non dimenticare di svuotare la cache. – gilden

+0

@gilden: mostra la casella di autenticazione, almeno ma non riesco a trovare un modo per autenticare correttamente. – dan

+0

Mi dispiace, non ho il tempo di dare un consiglio adeguato, ma suppongo che sia necessario impostare in modo esplicito il provider dell'utente per 'whole_website' o Sf2 userà il primo. Ciò che suggerisce PéCé funziona anche, suppongo, ma essendo un po 'ocd, vorrei prendere la soluzione difficile, ma più elegante :) – gilden

risposta

4

A mio parere, ciò che è necessario non è gestire gli utenti con l'autenticazione HTTP ma limitare l'accesso al proprio sito con l'autenticazione HTTP. Non usare la sicurezza Symfony2 per questo.

Lascia la sicurezza della tua app symfony2 come sarà in modalità di produzione e usa apache .htaccess per limitare l'accesso al sito.

La documentazione è qui http://httpd.apache.org/docs/2.2/howto/auth.html. Non vi resta che aggiungere alcune direttive in web/.htaccess, e creare un file utente/password come spiegato nel doc ...

+1

Grazie Pece. Preferirei comunque avere tutto a livello di applicazione, piuttosto che ricorrere ad Apache. – dan

+0

Ho deciso di andare per il tuo suggerimento perché non sembra essere facile a modo mio e, dopo tutto, è bello implementare le cose come si aspetterebbe un altro sviluppatore. – dan

+0

Penso che in questo modo sia utile se hai solo bisogno di proteggere l'accesso senza identificare gli utenti.Inoltre, una volta superata questa protezione temporanea, vedono l'app futura come sarà, con lo stesso processo di accesso. – AlterPHP

0

la mia soluzione in Symfony2, utilizzando il firewall di base di symfony (senza FOSUserBundle):

# app/config/security.yml 
security: 

    firewalls: 
     secured_area: 
      pattern: ^/ 
      anonymous: ~ 
      form_login: 
       login_path: login 
       check_path: login_check 

    access_control: 
     - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin, roles: ROLE_ADMIN } 
     - { path: ^/, roles: ROLE_USER } 

    providers: 
     in_memory: 
      memory: 
       users: 
        redattore: { password: 'somePasswordHere', roles: 'ROLE_USER' } 
        admin: { password: 'somePasswordHere', roles: 'ROLE_ADMIN' } 

    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

Funziona perfettamente per me. È una configurazione di base, senza password di hashing, senza provider di dati (sezione "providers:"), senza connessione https (tutto viene scritto in chiaro su Internet), senza logout e altre interessanti funzionalità. Spero che ti possa aiutare. Cordiali saluti

Problemi correlati