Symfony 2在基本身份验证后接收匿名令牌

时间:2011-07-21 12:14:17

标签: authentication symfony

我有一个使用基本in_memory身份验证的Symfony 2应用程序(如security documentation中所述)。登录在我们的开发环境中正常工作。但是在登台服务器上,基本身份验证似乎没有提供正确的令牌 - 如在此提供的日志文件中所见 - ;因此我们一次又一次地获取登录弹出窗口。

我们的安全配置:

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 个答案:

答案 0 :(得分:9)

您的开发环境可能正在将PHP作为mod_php运行,而您的登台服务器可能正在将其作为FastCGI运行。默认情况下,当您通过HTTP basic进行身份验证时,此上下文中未填充PHP_AUTH_USERPHP_AUTH_PW服务器变量,这些是Symfony用于创建安全上下文并验证密码的内容。

如果你在Apache上运行它作为FCGI,你可以解决这个问题。一种是强制FastCGI传递Authorization标头,它通常会抑制它。将其添加到其他FastCGI配置选项旁边的Apache站点定义中:

FcgidPassHeader     Authorization

对于其他应用程序,您可能还需要更大程度地处理(如here所述),但对于Symfony而言,只需传递标题即可。