Подтвердить что ты не робот

Безопасность Symfony2 http_basic отменяет действительные учетные данные

Я использую 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" и пароль "тестирование", он просто зацикливается и запрашивает у меня учетные данные бесконечно или отображает страницу с ошибкой.

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

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

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

4b9b3361

Ответ 1

Основная аутентификация 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

Ответ 2

Проблема заключается в том, что вы ограничиваете доступ к /.*, что означает все пути только к тем, у кого есть роль 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.

С уважением, Matt

Ответ 3

Такая же проблема сохраняется и в текущей версии (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

Ответ 4

i использую мой маршрут ограничения:

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

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

/correspondencia/recepcion/

хорошо

/correspondencia/recepcion

Ответ 5

Вам не нужно изменять свой 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

наслаждайтесь:)