Pergunta sobre firewall, security, symfony – Symfony 2 - esconder todo o site com um diálogo de autenticação HTTP

5

Eu estou usando o Symfony 2 para construir um website.

O trabalho está em andamento (portanto, não quero que os usuários ou mecanismos de pesquisa o acessem), mas meu cliente quer ver meu progresso. Eu estava pensando que uma solução fácil era proteger todo o site com autenticação HTTP usando o mecanismo fornecido pela funcionalidade de segurança do Symfony 2.

Eu estou usando FOSUserBundle como o site terá usuários que precisam se registrar e fazer o login.

Este é meu security.yml, que funciona muito bem:

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

Portanto, eu estava tentando adicionar outra coisa em cima, para permitir que o site fosse protegido pela Autenticação HTTP.
Eu mudei o arquivo para:

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

Basicamente eu adicionei owhole_website_provider provedor, owhole_website firewall e um extraaccess_control.
Mas isso não funcionou: quando eu acesso o site, sou redirecionado para o formulário de login, é isso.

Você tem alguma idéia se eu posso fazer isso e como?

N .: Eu preferiria não usar nenhum recurso do Apache para isso.

Me desculpe, eu não tenho tempo para dar o conselho adequado, mas eu estou supondo que você também precisa definir explicitamente o provedor de usuário parawhole_website ou Sf2 usará o primeiro. O que a PéCé está sugerindo funciona também, eu acho, mas sendo um pouco mais, eu tomaria a solução difícil, mas mais elegante :) gilden
O que acontece se você colocar owhole_website Firewall primeiro? Não esqueça de limpar o cache. gilden
@gilden: mostra a caixa de autenticação, pelo menos, mas não consigo encontrar uma maneira de autenticar corretamente. dan

Sua resposta

2   a resposta
0

minha solução no Symfony2, usando o firewall básico do symfony (sem o 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 perfeitamente para mim. É uma configuração muito básica - sem hashing de senhas, sem provedor de banco de dados (seção "provedores:"), sem conexão https (tudo fica em texto simples em toda a internet), sem logout e outros recursos interessantes. Espero que isso ajude você. Com os cumprimentos

4

Na minha opinião, o que você precisa é não gerenciar usuários com autenticação HTTP, mas restringir o acesso ao seu site com autenticação HTTP. Não use a segurança do Symfony2 para isso.

Deixe sua segurança de aplicativo symfony2 como ela estará no modo de produção e use o .htaccess do apache para restringir o acesso ao site.

A documentação está aquihttp://httpd.apache.org/docs/2.2/howto/auth.html. Você só precisa adicionar algumas diretivas em web / .htaccess, e criar um arquivo de usuário / senha como explicado no doc ...

Obrigado Pece. Eu ainda preferiria ter tudo feito no nível do aplicativo, em vez de recorrer ao Apache. dan
Eu decidi ir para a sua sugestão, porque não parece ser fácil do meu jeito e, afinal, é bom implementar as coisas como outro desenvolvedor esperaria. dan
Eu acho que isso é bom se você só precisa proteger o acesso sem identificar os usuários. Além disso, uma vez que eles passam essa segurança temporária, eles vêem o aplicativo futuro como ele será, com o mesmo processo de login. AlterPHP

Perguntas relacionadas