【发布时间】:2015-07-07 15:13:29
【问题描述】:
我正在尝试为我的应用程序编写一些功能测试,我遇到的问题是,除非我真的将用户从数据库中拉出,否则我无法让它使用新的用户对象。我想尽可能减少数据库查询的数量。
我所有的用户都存储在数据库中,并通过 Doctrine 层访问。以下是我如何进行安全设置以及目前的工作方式:
// app/security.yml
security:
providers:
administrators:
entity: { class: User, property: email }
encoders:
User:
algorithm: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
firewalls:
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false
default:
anonymous: ~
http_basic: ~
form_login:
login_path: login
check_path: login-check
csrf_provider: security.csrf.token_manager
logout:
path: /logout
target: login
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, role: ROLE_ADMIN }
通过关注http://symfony.com/doc/current/cookbook/testing/simulating_authentication.html 我有以下工作
$client = static::createClient();
$user = $client->getContainer()->get('doctrine')->getEntityManager()->getRepository('User')->findOneByEmail('nick@example.com');
$session = $client->getContainer()->get('session');
$firewall = 'default';
$token = new UsernamePasswordToken($user, null, $firewall, $user->getRoles());
$session->set('_security_'.$firewall, serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$client->getCookieJar()->set($cookie);
$crawler = $client->request('GET', '/some-secure-url');
$this->assertTrue($client->getResponse()->isSuccessful());
我想做的是:
$client = static::createClient();
$user = new User();
$user->setRoles(['ROLE_ADMIN']);
$session = $client->getContainer()->get('session');
$firewall = 'default';
$token = new UsernamePasswordToken($user, null, $firewall, $user->getRoles());
$session->set('_security_'.$firewall, serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$client->getCookieJar()->set($cookie);
$crawler = $client->request('GET', '/some-secure-url');
$this->assertTrue($client->getResponse()->isSuccessful());
但目前当我尝试这种方法时,我得到以下结果
You cannot refresh a user from the EntityUserProvider that does not contain an identifier. The user object has to be serialized with its own identifier mapped by Doctrine.
任何关于这方面的建议都会很棒:)
【问题讨论】:
标签: php symfony doctrine-orm functional-testing