Безопасность Symfony2 http_basic отклоняет действительные учетные данные - PullRequest
12 голосов
/ 13 мая 2011

Я использую Symfony Standard 2.0.0BETA1 и пытался настроить http_basic аутентификацию точно так же, как в главе этой книги

security:
encoders:
    Symfony\Component\Security\Core\User\User: plaintext

providers:
    main:
        users:
            foo: { password: testing, roles: ROLE_USER }

firewalls:
    main:
        pattern:    /.*
        http_basic: true
        logout:     true

access_control:
    - { path: /.*, role: ROLE_USER }

Проблема в том, что я пытаюсь открыть страницу иотправить имя пользователя "foo" и пароль "testing", он просто зацикливается и запрашивает у меня учетные данные бесконечно или отображает страницу ошибки.

Действия по воспроизведению проблемы:

  1. Скопируйте конфигурацию безопасности из http://symfony.com/doc/current/book/security/overview.html#configuration и вставьте его в файл security.yml
  2. Обновить домашнюю страницу приложения
  3. Введите действительные учетные данные

Ожидаемое поведение - видеть домашнюю страницу, но вместо этогоОтображается запрос учетных данных.

Кто-нибудь знает, почему это происходит и как это исправить?

Ответы [ 5 ]

7 голосов
/ 28 февраля 2013

Та же проблема все еще возникает в текущей версии (Symfony версии 2.1.8).

Это из-за особого способа, которым Apache + PHP в качестве FastCGI обрабатывает HTTP-переменные аутентификации.

Впо крайней мере, исправление для текущей версии немного проще, чем было раньше (по сравнению с ответом @ Teo.sk), и инструкции доступны непосредственно в виде комментариев в файле vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/ServerBag.php платформы:

/*
* php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default
* For this workaround to work, add these lines to your .htaccess file:
* RewriteCond %{HTTP:Authorization} ^(.+)$
* RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
*
* A sample .htaccess file:
* RewriteEngine On
* RewriteCond %{HTTP:Authorization} ^(.+)$
* RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
* RewriteCond %{REQUEST_FILENAME} !-f
* RewriteRule ^(.*)$ app.php [QSA,L]
*/

Короче говоря, чтобы исправить это, все, что вам нужно сделать, это добавить следующие строки в файл .htaccess папки web/ вашего приложения:

RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Новая информация (2013-05-01) : теперь я использую Symfony версии 2.2.1, и для исправления мне пришлось добавить эти две строки кода прямо под следующей строкой web/.htaccess:

RewriteEngine On
7 голосов
/ 05 октября 2011

Базовая аутентификация http не работает с PHP как cgi / fastCGI под Apache

Существует обходной путь:

app_dev.php

if( !isset($_SERVER['PHP_AUTH_USER']) )
{
    if (isset($_SERVER['HTTP_AUTHORIZATION']) && (strlen($_SERVER['HTTP_AUTHORIZATION']) > 0))
    {
        list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
        if( strlen($_SERVER['PHP_AUTH_USER']) == 0 || strlen($_SERVER['PHP_AUTH_PW']) == 0 )
        {
            unset($_SERVER['PHP_AUTH_USER']);
            unset($_SERVER['PHP_AUTH_PW']);
        }
    }
}

web / .htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] 
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>

Источник: выпуск Symfony Github

7 голосов
/ 13 мая 2011

Проблема в том, что вы ограничили доступ к /.*, что означает все пути, только для пользователей, имеющих роль ROLE_USER.

Скажите, что ваш путь входа в систему /login, пользователь пытается получить доступ к любому другому пути и перенаправляется на путь входа в систему.Путь входа в систему (/login) будет соответствовать шаблону контроля доступа /.*.В этом случае пользователю будет отказано в доступе, потому что у него нет роли ROLE_USER прямо сейчас.Компонент безопасности снова перенаправит пользователя в форму входа, чтобы он мог пройти проверку подлинности, чтобы получить роль, которая ограничена, и перенаправит пользователя в форму входа для проверки подлинности и т. Д.

Вот простое решениечтобы избежать этой проблемы.Вы можете разрешить доступ к форме входа анонимному пользователю с помощью активации конфигурации анонимного пользователя и нового элемента управления доступом.Добавьте это ниже main в конфигурации firewalls, чтобы включить анонимного пользователя:

security:
    firewalls:
        main:
            anonymous: true

И добавьте новый элемент управления доступом, чтобы позволить анонимному пользователю получить доступ к шаблону /login:

access_control:
    - { path: /login, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: /.*, role: ROLE_USER }

Здесь важен порядок, поскольку правило таково: выигрывается первый путь.Таким образом, путь /login должен быть выше вашего шаблона для другого пути /.*.Это должно разрешить вам цикл перенаправления.

Документация Symfony о безопасности переписывается прямо сейчас и расскажет подробнее об этой проблеме.Он находится в репозитории symfony-docs github в ветке security .

С уважением, Мэтт

1 голос
/ 23 февраля 2015

вам не нужно изменять ваш SymfonyProject, вам также нужно изменить конфигурацию apache2.

sudoedit / etc / apache2 / sites-enabled / [ваш сайт] .conf

вставить

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]

продолжать перезапускать apache2

наслаждайся :)

0 голосов
/ 04 декабря 2011

я использую свой маршрут:

 - { path: /correspondencia/recepcion/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
 - { path: /correspondencia/recepcion, role: ROLE_ADMIN }

без последней косой черты неправильно

/correspondencia/recepcion/

хорошо

/correspondencia/recepcion
...