Symfony 2 получает анонимный токен после базовой аутентификации

У меня есть приложение Symfony 2, использующее базовую аутентификацию in_memory (как описано в документации по безопасности). Вход в систему отлично работает в нашей среде разработки. Но на промежуточном сервере базовая аутентификация, похоже, не обеспечивает надлежащего токена - как показано в предоставленном здесь файле журнала; таким образом, мы продолжаем получать всплывающее окно входа снова и снова.

Наша конфигурация безопасности:

security:
    firewalls:
        secured_area:
            pattern:    ^/
            anonymous: ~
            http_basic:
                realm: "Secured Demo Area"

    access_control:
        - { path: ^/admin, roles: [ROLE_ADMIN]}

    providers:
        in_memory:
            users:
                admin: { password: admin, roles: 'ROLE_ADMIN' }

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

Это вывод журнала из (успешной) среды разработки:

[2011-07-21 13:49:48] security.DEBUG: Read SecurityContext from the session [] []
[2011-07-21 13:49:48] security.DEBUG: Reloading user from user provider. [] []
[2011-07-21 13:49:48] security.DEBUG: Username "root" was reloaded from user provider. [] []

И это вывод журнала из учетной записи промежуточной среды:

[2011-07-21 13:53:08] security.INFO: Populated SecurityContext with an anonymous Token [] []
[2011-07-21 13:53:08] security.DEBUG: Access denied (user is not fully authenticated); redirecting to authentication entry point [] []
[2011-07-21 13:53:08] security.DEBUG: Calling Authentication entry point [] []

Заранее благодарим за помощь.

Ответ 1

В вашей среде разработчиков, вероятно, работает PHP как mod_php, в то время как ваш промежуточный сервер, вероятно, работает как FastCGI. По умолчанию переменные сервера PHP_AUTH_USER и PHP_AUTH_PW не заполняются в этом контексте при аутентификации через HTTP basic, и это то, что Symfony использует для создания контекста безопасности и проверки вашего пароля.

Если вы используете это как FCGI на Apache, вы можете это исправить. Один из них - заставить FastCGI передать заголовок авторизации, который он обычно подавляет. Добавьте это в определение сайта Apache рядом с другими параметрами конфигурации FastCGI:

FcgidPassHeader     Authorization

В других приложениях вам также может понадобиться в большей степени обходиться (как описано здесь), но для Symfony достаточно просто передать заголовок.