我有一个使用基本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 [] []
提前感谢您的帮助。
答案 0 :(得分:9)
您的开发环境可能正在将PHP作为mod_php运行,而您的登台服务器可能正在将其作为FastCGI运行。默认情况下,当您通过HTTP basic进行身份验证时,此上下文中未填充PHP_AUTH_USER
和PHP_AUTH_PW
服务器变量,这些是Symfony用于创建安全上下文并验证密码的内容。
如果你在Apache上运行它作为FCGI,你可以解决这个问题。一种是强制FastCGI传递Authorization标头,它通常会抑制它。将其添加到其他FastCGI配置选项旁边的Apache站点定义中:
FcgidPassHeader Authorization
对于其他应用程序,您可能还需要更大程度地处理(如here所述),但对于Symfony而言,只需传递标题即可。