Безопасность 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" и пароль "тестирование", он просто зацикливается и запрашивает у меня учетные данные бесконечно или отображает страницу с ошибкой.
Действия по воспроизведению проблемы:
Ожидаемое поведение - увидеть домашнюю страницу, но вместо этого появится запрос учетных данных.
Кто-нибудь знает, почему это происходит и как его исправить?
Ответы
Ответ 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
наслаждайтесь:)