我们正在Symfony 2中从头开始构建业务应用程序,我在用户注册流程中遇到了一些问题:在用户创建帐户后,他们应该使用这些凭据自动登录,而不是立即被迫再次提供他们的证书.
任何人都有这方面的经验,或能够指出我正确的方向?
我想在注册过程后立即登录用户,而不通过登录表单.
这可能吗 ?我找到了一个解决方案FOSUserBundle,但我没有在我正在进行的项目中使用它.
这是我的security.yml,我正在使用两个防火墙.纯文本编码器仅用于测试.
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
Ray\CentralBundle\Entity\Client: md5
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
in_memory:
users:
admin: { password: admin, roles: [ 'ROLE_ADMIN' ] }
entity:
entity: { class: Ray\CentralBundle\Entity\Client, property: email }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
user_login:
pattern: ^/user/login$
anonymous: ~
admin_login:
pattern: ^/admin/login$
anonymous: ~
admin:
pattern: ^/admin
provider: in_memory
form_login:
check_path: /admin/login/process
login_path: /admin/login
default_target_path: /admin/dashboard
logout:
path: /admin/logout
target: /
site:
pattern: ^/
provider: entity
anonymous: ~
form_login: …Run Code Online (Sandbox Code Playgroud) 我目前正在将2.0.*项目迁移到Symfony的当前2.1 beta版.
在我的功能测试中,我目前使用此代码来创建具有身份验证的客户端:
$client = // create a normal test client
$role = 'ROLE_USER';
$firewallName = 'main';
$user = // pull a user from db
$client->getCookieJar()->set(new \Symfony\Component\BrowserKit\Cookie(session_name(), true));
$token = new UsernamePasswordToken($user, null, $firewallName, array($role));
self::$kernel->getContainer()->get('session')->set('_security_' . $firewallName,
serialize($token));
Run Code Online (Sandbox Code Playgroud)
这在预期的2.0.*中有效,但在2.1中没有,数据没有在会话中设置.
有任何想法吗?
编辑(添加更多信息):
似乎问题出在方法" onKernelResponse " 中的文件" Symfony\Component\Security\Http\Firewall\ContextListener "中.有这个代码:
if ((null === $token = $this->context->getToken()) || ($token instanceof AnonymousToken)) {
$session->remove('_security_'.$this->contextKey);
} else {
$session->set('_security_'.$this->contextKey, serialize($token));
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下if"$ token instanceof AnonymousToken"是真的,因此会话密钥被删除.如果我注释掉那些代码,一切都按预期工作.
所以我想我的新问题是:我能做些什么来使令牌不是匿名的?
我尝试验证用户:
<?php
/**
* @Route("/testLogin", name="testLogin")
*/
public function testLoginAction()
{
$em = $this->getDoctrine()->getEntityManager();
$user = $em->getRepository('ApplicationDefaultBundle:User')->findOneBy(array('id' => 126));
$providerKey = 'main';
$token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles());
$this->container->get('security.context')->setToken($token);
return $this->redirect($this->generateUrl('testCheck'));
}
/**
* @Route("/testCheck", name="testCheck")
*/
public function testCheckAction()
{
if (false === $this->get('security.context')->isGranted(
'IS_AUTHENTICATED_REMEMBERED'
)) {
return new Response('Not logged');
}
$user = $this->container->get('security.context')->getToken()->getUser();
return new Response($user->getUsername.' is logged');
}
Run Code Online (Sandbox Code Playgroud)
但我得到永久302重定向到/登录页面.
security:
encoders:
Application\Bundle\DefaultBundle\Entity\User:
algorithm: sha512
iterations: 24
encode_as_base64: true
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SPECIALIST: ROLE_USER
ROLE_EMPLOYER: ROLE_USER …Run Code Online (Sandbox Code Playgroud) 我使用它FacebookBundle来验证我的Symfony2应用程序中的用户.但是,我想用phpunit创建功能测试,该测试使用经过身份验证的用户.
此外,我不想使用facebook用户,而是使用一个用户.
有人知道如何实现这个吗?
我正在开发构建在Symfony 2上的Web应用程序的一部分.与许多应用程序一样,需要身份验证和授权.如何通过传递或伪造登录来继续开发,考虑ACL?
在文档中,login_check身份验证和会话是否透明.我想我可能需要实现它的版本或以某种方式将其称为以不同的用户/角色登录