Jie*_*eng 10 php authentication symfony
我正在开发构建在Symfony 2上的Web应用程序的一部分.与许多应用程序一样,需要身份验证和授权.如何通过传递或伪造登录来继续开发,考虑ACL?
在文档中,login_check身份验证和会话是否透明.我想我可能需要实现它的版本或以某种方式将其称为以不同的用户/角色登录
Kas*_*een 29
我不完全确定我理解你的问题,但你只是问你如何以编程方式登录?
在我的测试中,我只是做一个电话,如:
$this->container->get('security.context')->setToken(
new UsernamePasswordToken(
'maintenance', null, 'main', array('ROLE_FIXTURE_LOADER')
)
);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,"维护"甚至不是真正的用户实体,它只是我为我的灯具制作的用户名,以便他们可以通过拥有ROLE_FIXTURE_LOADER但是如果您确实想要以完整用户实体身份登录(以便他们拥有正确的ACL ID)你可以$user从数据库中获取一个对象并调用:
$this->container->get('security.context')->setToken(
new UsernamePasswordToken(
$user, null, 'main', $user->getRoles())
)
);
Run Code Online (Sandbox Code Playgroud)
这不是完全登录,但它确实与RBAC一起工作,如果你传递一个实际的用户对象,我不明白为什么它不适用于ACL.
至于我的前端的功能测试,如果我需要登录,我只需导航到登录页面并按照测试文档提交表单.对于其中任何一个工作,您需要访问容器,因此您需要扩展WebTestCase或推动自己启动内核的能力(请参阅此处).
我有一种感觉,我错误地理解了这个问题(即你需要做一些比放置令牌更复杂的事情).也许你可以试着澄清一下你的意思
传递或伪造登录
在测试中植入安全性令牌的具体示例:
首先,我们为要使用的测试创建一个基类,其中包含一个登录便捷方法.这可以通过扩展来完成的WebTestCase,并使用getContainer一个方法,client或者你可以拉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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你只需要在你想要的任何测试中使用你的基类.像这样:
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.
}
}
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助.