Pytanie w sprawie firewall, symfony, security – Symfony 2 - ukryj całą witrynę za pomocą okna dialogowego uwierzytelniania HTTP

5

Używam Symfony 2 do budowania strony internetowej.

Praca jest w toku (dlatego nie chcę, aby użytkownicy lub wyszukiwarki mieli do niej dostęp), ale mój klient chce zobaczyć moje postępy. Myślałem, że łatwym rozwiązaniem będzie ochrona całej strony internetowej za pomocą uwierzytelniania HTTP przy użyciu mechanizmu zapewnianego przez funkcję bezpieczeństwa Symfony 2.

Używam FOSUserBundle, ponieważ witryna będzie miała użytkowników, którzy muszą się zarejestrować i zalogować.

To jest mój security.yml, który działa świetnie:

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

Dlatego starałem się dodać coś innego, aby strona była chroniona przez uwierzytelnianie HTTP.
Zmieniłem plik na:

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

Zasadniczo dodałemwhole_website_provider dostawcawhole_website firewall i dodatkoweaccess_control.
Ale to nie zadziałało: kiedy uzyskuję dostęp do strony, przekierowuję do formularza logowania, to wszystko.

Czy masz jakiś pomysł, czy mogę to zrobić i jak?

N.B .: Wolałbym nie używać do tego żadnej funkcji Apache.

@gilden: pokazuje pole uwierzytelniania, ale nie mogę znaleźć sposobu na poprawne uwierzytelnienie. dan
Co się stanie, jeśli umieściszwhole_website najpierw zapora? Nie zapomnij wyczyścić pamięci podręcznej. gilden
Przykro mi, że nie mam czasu, aby udzielić właściwej porady, ale domyślam się, że trzeba również wyraźnie ustawić dostawcę użytkownikawhole_website lub Sf2 użyje pierwszego. Myślę, że to, co sugeruje PéCé, wydaje mi się, ale będąc nieco ciekawym, podjąłbym się trudnego, ale bardziej eleganckiego rozwiązania :) gilden

Twoja odpowiedź

2   odpowiedź
0

używając podstawowej zapory sieciowej symfony (bez 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>

To działa idealnie dla mnie. Jest to bardzo podstawowa konfiguracja - bez haszowania haseł, bez dostawcy bazy danych (sekcja „dostawcy:”), bez połączenia https (wszystko w zwykłym tekście w całym Internecie), bez wylogowania i innych ciekawych funkcji. Mam nadzieję, że ci to pomoże. Z poważaniem

4

TP, ale ograniczyć dostęp do witryny za pomocą uwierzytelniania HTTP. Nie używaj do tego zabezpieczenia Symfony2.

Pozostaw ochronę aplikacji symfony2, ponieważ będzie w trybie produkcyjnym i użyj apache .htaccess, aby ograniczyć dostęp do witryny.

Dokumentacja jest tutajhttp://httpd.apache.org/docs/2.2/howto/auth.html. Wystarczy dodać kilka dyrektyw do web / .htaccess i utworzyć plik użytkownika / hasła, jak wyjaśniono w dokumencie ...

Myślę, że ten sposób jest dobry, jeśli wystarczy zabezpieczyć dostęp bez identyfikowania użytkowników. Co więcej, po przejściu tego tymczasowego zabezpieczenia widzą przyszłą aplikację w takiej postaci, w jakiej będą, przy użyciu tego samego procesu logowania. AlterPHP
Zdecydowałem się pójść za twoją sugestią, ponieważ wydaje mi się, że nie jest to łatwe, a przecież dobrze jest zaimplementować rzeczy, jakich oczekiwałby inny programista. dan
Dzięki Pece. Nadal wolałbym mieć wszystko zrobione na poziomie aplikacji, a nie uciekać się do Apache. dan

Powiązane pytania