Frage an firewall, symfony, security – Symfony 2 - Blendet die gesamte Website mit einem HTTP-Authentifizierungsdialog aus

5

Ich verwende Symfony 2 zum Erstellen einer Website.

Die Arbeit ist in Bearbeitung (daher möchte ich nicht, dass Benutzer oder Suchmaschinen darauf zugreifen), aber mein Kunde möchte meinen Fortschritt sehen. Ich war der Meinung, dass eine einfache Lösung darin besteht, die gesamte Website mithilfe des von der Symfony 2-Sicherheitsfunktion bereitgestellten Mechanismus durch HTTP-Authentifizierung zu schützen.

Ich verwende FOSUserBundle, da die Website Benutzer enthält, die sich registrieren und anmelden müssen.

Dies ist meine security.yml, die hervorragend funktioniert:

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

Deshalb habe ich versucht, noch etwas hinzuzufügen, damit die Website durch HTTP-Authentifizierung geschützt werden kann.
Ich habe die Datei geändert in:

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

Grundsätzlich habe ich diewhole_website_provider Anbieter, derwhole_website Firewall und ein extraaccess_control.
Aber das hat nicht funktioniert: Wenn ich auf die Website zugreife, werde ich zum Anmeldeformular weitergeleitet, das war's.

Hast du eine Idee, ob ich das kann und wie?

NB: Ich würde es vorziehen, keine Apache-Funktion dafür zu verwenden.

Was passiert, wenn Sie diewhole_website Firewall zuerst? Vergiss nicht, den Cache zu leeren. gilden
Es tut mir leid, dass ich keine Zeit habe, angemessene Ratschläge zu erteilen, aber ich vermute, dass Sie auch den Benutzeranbieter explizit festlegen müssenwhole_website oder Sf2 verwendet den ersten. Was PéCé vorschlägt, funktioniert vermutlich auch, aber da es etwas merkwürdig ist, würde ich die schwierige und doch elegantere Lösung übernehmen :) gilden
@gilden: das zeigt die Authentifizierungsbox, aber ich kann keine Möglichkeit finden, mich korrekt zu authentifizieren. dan

Deine Antwort

2   die antwort
0

Meine Lösung in Symfony2 unter Verwendung der grundlegenden Firewall von Symfony (ohne 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>

Es funktioniert perfekt für mich. Es ist eine sehr einfache Konfiguration - ohne Hashing-Passwörter, ohne Datenbank-Provider (Abschnitt "Provider:"), ohne https-Verbindung (alles läuft im Internet im Klartext), ohne Logout-Zeug und andere nette Features. Ich hoffe es hilft dir. Mit freundlichen Grüßen

4

Meiner Meinung nach müssen Sie nicht Benutzer mit HTTP-Authentifizierung verwalten, sondern den Zugriff auf Ihre Site mit HTTP-Authentifizierung einschränken. Verwenden Sie hierfür nicht die Symfony2-Sicherheit.

Belassen Sie die Sicherheit Ihrer symfony2-App im Produktionsmodus und verwenden Sie apache .htaccess, um den Zugriff auf die Site einzuschränken.

Dokumentation ist hierhttp://httpd.apache.org/docs/2.2/howto/auth.html. Sie müssen nur einige Anweisungen in web / .htaccess hinzufügen und eine Benutzer- / Kennwortdatei erstellen, wie im Dokument beschrieben.

Ich denke, dieser Weg ist gut, wenn Sie nur den Zugriff sichern müssen, ohne Benutzer zu identifizieren. Überdies sehen sie nach dem Bestehen dieser vorübergehenden Sicherheit die zukünftige App mit demselben Anmeldevorgang wie sie sein wird. AlterPHP
Ich habe mich für Ihren Vorschlag entschieden, weil es auf meine Weise nicht einfach zu sein scheint und es immerhin gut ist, Dinge so zu implementieren, wie es ein anderer Entwickler erwarten würde. dan
Vielen Dank, Pece. Ich würde es immer noch vorziehen, alles auf Anwendungsebene zu erledigen, anstatt auf Apache zurückzugreifen. dan

Verwandte Fragen