Symfony2 http_basic安全性拒绝有效凭据

时间:2011-05-13 08:25:05

标签: security symfony http-basic-authentication

我使用Symfony Standard 2.0.0BETA1并尝试配置与this book chapter完全相同的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”和密码“testing”时,它只是循环并无限地询问我的凭证或显示错误页面。

重现问题的步骤:

  1. http://symfony.com/doc/current/book/security/overview.html#configuration复制安全配置并将其传递给security.yml文件
  2. 刷新应用主页
  3. 输入有效凭据
  4. 预期的行为是查看主页,但会显示凭据提示。

    有谁知道为什么会发生这种情况以及如何解决这个问题?

5 个答案:

答案 0 :(得分:7)

问题是您是否只限制了具有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分支下的security github存储库中。

此致 马特

答案 1 :(得分:7)

在Apache

下,使用PHP作为cgi / fastCGI打破了http基本身份验证

有一种解决方法:

<强> 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']);
        }
    }
}

网络/ 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 issue

答案 2 :(得分:7)

当前版本(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

答案 3 :(得分:1)

您不需要修改SymfonyProject,您还需要更改apache2配置。

sudoedit / etc / apache2 / sites-enabled / [your site] .conf

插入

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]

继续重启apache2

享受:)

答案 4 :(得分:0)

我使用我的边界路线:

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

没有最后一个斜线 错

/correspondencia/recepcion/

/correspondencia/recepcion