如何在Symfony 2中通过伪造登录来测试acl


How to develop by faking login to test ACLs in Symfony 2

我正在开发一个基于Symfony 2的web应用程序的一部分。与许多应用程序一样,身份验证&;需要授权。我如何继续开发,考虑ACL通过或伪造登录?

在文档中,login_check透明地完成身份验证和会话部分。我想我可能需要实现它的一个版本或者调用它以不同的用户/角色登录

我不完全确定我理解你的问题,但你只是问你如何以编程方式登录?

在我的测试中,我只是做了这样一个调用:

$this->container->get('security.context')->setToken(
    new UsernamePasswordToken(
        'maintenance', null, 'main', array('ROLE_FIXTURE_LOADER')
    )
);

在这种情况下,"维护"甚至不是一个真正的用户实体,它只是一个用户名,我为我的装置,使他们可以访问服务通过有ROLE_FIXTURE_LOADER,但如果你想登录作为一个完整的用户实体(使他们有正确的ACL ID),你可以从数据库中获得一个$user对象,并调用:

$this->container->get('security.context')->setToken(
    new UsernamePasswordToken(
        $user, null, 'main', $user->getRoles())
    )
);

这不能做一个完整的登录,但它确实与RBAC工作,我不明白为什么它不能与ACL工作,如果你传递一个实际的用户对象。

对于前端的功能测试,如果我需要登录,我只需导航到登录页面并按照测试文档提交表单。要使这两种方法都有效,您都需要访问容器,因此您需要扩展WebTestCase,或者使用您自己的能力来引导内核(请参阅这里的)。

我有一种感觉,我误解了这个问题(即你需要做一些比仅仅放置令牌更复杂的事情)。也许你可以试着再解释一下

是什么意思

通过或伪造登录

一个在测试中植入安全令牌的具体示例:

首先,我们为我们的测试创建一个基类,其中包含一个登录方便方法。这可以通过扩展WebTestCase并在client上使用getContainer方法来完成,或者您可以将WebTestCase分开来滚动您自己的基类,该基类只是在没有客户端的情况下启动内核并返回容器(请参阅我的链接以获得实现该目标的两个解决方案)。

namespace Acme'SomeBundle'Tests;
use Symfony'Bundle'FrameworkBundle'Test'WebTestCase;
use Symfony'Component'Security'Core'Authentication'Token'UsernamePasswordToken;
abstract class AcmeTestCase extends WebTestCase {
    protected function loginAs($client, $username) {
        $container = $client->getContainer();
        $doctrine = $container->get('doctrine');
        $user = $this->loadUser($doctrine, $username);
        // First Parameter is the actual user object.
        // Change 'main' to whatever your firewall is called in security.yml
        $container->get('security.context')->setToken(
            new UsernamePasswordToken(
                $user, null, 'main', $user->getRoles()
            )
        );
    }
    private function loadUser($doctrine, $username) {
        // Don't have to use doctrine if you don't want to, you could use
        // a service to load your user since you have access to the
        // container.
        // Assumes User entity implements UserInterface
        return $doctrine
                ->getRepository('AcmeUserBundle:User')
                ->findOneByUsername($username);
    }
}

那么你只需要在任何你想要的测试中使用你的基类。像这样:

namespace Acme'SomeBundle'Tests'Entity;
use Acme'SomeBundle'Tests'AcmeTestCase;
class SomeEntityTest extends AcmeTestCase {
    public function somethingTest() {
        $this->loginAs(static::createClient(), 'SomeUsernameInDB');
        // Do the rest of your test here.
    }
}

我不确定我理解你的问题很好,但如果你只是想看到不同的用户角色的应用程序,你可以使用Symfony角色切换器记录在这里:http://symfony.com/doc/current/book/security.html impersonating-a-user

所以你只需要在你的url中添加一个参数来将你的应用作为另一个连接的用户。

查看:https://github.com/schmittjoh/JMSSecurityExtraBundle/tree/master/Tests/Functional