Вопрос по symfony – Symfony 2 - скрыть весь сайт с помощью диалога HTTP-аутентификации

5

Я использую Symfony 2 для создания веб-сайта.

Работа продолжается (поэтому я не хочу, чтобы пользователи или поисковые системы обращались к ней), но мой клиент хочет видеть мой прогресс. Я думал, что простым решением было защитить весь сайт с помощью HTTP-аутентификации, используя механизм, предоставляемый функциональностью безопасности Symfony 2.

Я использую FOSUserBundle, так как на сайте будут пользователи, которым необходимо зарегистрироваться и войти в систему.

Это мой security.yml, который прекрасно работает:

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

Поэтому я пытался добавить что-то еще, чтобы веб-сайт был защищен HTTP-аутентификацией.
Я изменил файл на:

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

В основном я добавилwhole_website_provider провайдер,whole_website брандмауэр и дополнительныйaccess_control.
Но это не сработало: когда я захожу на веб-сайт, меня перенаправляют на форму входа в систему, вот и все.

У вас есть идея, могу ли я это сделать и как?

НБ .: Я бы предпочел не использовать для этого какую-либо функцию Apache.

Что произойдет, если вы положитеwhole_website брандмауэр первым? Не забудьте очистить кеш. gilden
@gilden: это показывает окно аутентификации, по крайней мере, но я не могу найти способ аутентифицироваться правильно. dan
Я сожалею, что у меня нет времени, чтобы дать надлежащий совет, но я полагаю, что вам также нужно явно указать поставщика услуг дляwhole_website или Sf2 будет использовать первый. Что P & # xE9; C & # xE9; я полагаю, что это тоже хорошо работает, но, будучи несколько странным, я бы взял трудное, но более элегантное решение :) gilden

Ваш Ответ

2   ответа
4

вам нужно не управлять пользователями с HTTP-аутентификацией, а ограничить доступ к вашему сайту с помощью HTTP-аутентификации. Не используйте для этого безопасность Symfony2.

Оставьте безопасность приложения symfony2 в обычном режиме и используйте apache .htaccess, чтобы ограничить доступ к сайту.

Документация здесьhttp://httpd.apache.org/docs/2.2/howto/auth.html, Вам просто нужно добавить некоторые директивы в web / .htaccess и создать файл пользователя / пароля, как описано в документе ...

Спасибо, Пис. Я все же предпочел бы, чтобы все было сделано на уровне приложений, а не прибегать к Apache. dan
Я решил пойти на ваше предложение, потому что мне кажется, что это нелегко, и, в конце концов, хорошо реализовывать вещи так, как ожидал бы другой разработчик. dan
Я думаю, что этот способ хорош, если вам просто нужен безопасный доступ без идентификации пользователей. Более того, как только они проходят эту временную защиту, они видят будущее приложение таким же, каким оно будет, с тем же процессом входа в систему.
0

используя базовый брандмауэр Symfony (без 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]

Это прекрасно работает для меня. Это очень базовая конфигурация - без хэширования паролей, без провайдера базы данных (раздел «провайдеры:»), без соединения https (все идет в простом тексте по всему интернету), без выхода из системы и других полезных функций. Я надеюсь, что это поможет вам. С наилучшими пожеланиями

Похожие вопросы