Pregunta sobre firewall, security, symfony – Symfony 2 - oculta todo el sitio web con un diálogo de autenticación HTTP

5

Estoy usando Symfony 2 para construir un sitio web.

El trabajo está en progreso (por lo tanto, no quiero que los usuarios o motores de búsqueda accedan a él), pero mi cliente quiere ver mi progreso. Pensaba que una solución fácil era proteger todo el sitio web con autenticación HTTP utilizando el mecanismo provisto por la funcionalidad de seguridad Symfony 2.

Estoy usando FOSUserBundle ya que el sitio web tendrá usuarios que necesitan registrarse e iniciar sesión.

Este es mi security.yml, que funciona muy bien:

<code>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
</code>

Por lo tanto, estaba tratando de agregar algo más, para permitir que el sitio web esté protegido por autenticación HTTP.
Cambié el archivo a:

<code>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
</code>

Básicamente agregué elwhole_website_provider proveedor, elwhole_website cortafuegos y un extraaccess_control.
Pero eso no funcionó: cuando accedo al sitio web, me redireccionan al formulario de inicio de sesión, eso es todo.

¿Tienes idea de si puedo hacerlo y cómo?

N.B .: Preferiría no usar ninguna función de Apache para ello.

¿Qué pasa si pones elwhole_website firewall primero? No te olvides de borrar el caché. gilden
Lo siento, no tengo tiempo para dar un consejo adecuado, pero supongo que también debe configurar explícitamente el proveedor del usuario parawhole_website o Sf2 utilizará el primero. Supongo que lo que PéCé sugiere es que también funciona, pero siendo un tanto ocd, me gustaría asumir la solución más difícil, pero aún más elegante :) gilden
@gilden: que muestra el cuadro de autenticación, al menos pero no puedo encontrar una manera de autenticar correctamente. dan

Tu respuesta

2   la respuesta
0

usando el firewall básico de Symfony (sin FOSUserBundle):

<code># 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]
</code>

Funciona perfectamente para mí. Es una configuración muy básica: sin contraseñas de hash, sin proveedor de base de datos (sección "proveedores:"), sin conexión https (todo va en texto plano a través de Internet), sin cosas de cierre de sesión y otras características interesantes. Espero que te ayude. Atentamente

4

lo que necesita no es administrar usuarios con autenticación HTTP, sino restringir el acceso a su sitio con autenticación HTTP. No uses la seguridad de Symfony2 para eso.

Deje la seguridad de su aplicación symfony2 ya que estará en modo de producción y use apache .htaccess para restringir el acceso al sitio.

La documentacion esta aquihttp://httpd.apache.org/docs/2.2/howto/auth.html. Solo tiene que agregar algunas directivas en web / .htaccess y crear un archivo de usuario / contraseña como se explica en el documento ...

He decidido apostar por tu sugerencia porque no parece ser fácil a mi manera y, después de todo, es bueno implementar las cosas como lo esperaría otro desarrollador. dan
Gracias Pece. Todavía preferiría tener todo hecho en el nivel de la aplicación, en lugar de recurrir a Apache. dan
Creo que esta forma es buena si solo necesita proteger el acceso sin identificar a los usuarios. Además, una vez que pasan esta seguridad temporal, ven la aplicación futura como será, con el mismo proceso de inicio de sesión. AlterPHP

Preguntas relacionadas