我们正在Symfony 2中从头开始构建一个商业应用程序,而我在用户注册流程中遇到了一点障碍:用户创建帐户后,他们应该使用这些凭据自动登录,而不是立即被迫再次提供凭据.
有没有人有过这方面的经验,或者能为我指出正确的方向?
我们正在Symfony 2中从头开始构建一个商业应用程序,而我在用户注册流程中遇到了一点障碍:用户创建帐户后,他们应该使用这些凭据自动登录,而不是立即被迫再次提供凭据.
有没有人有过这方面的经验,或者能为我指出正确的方向?
Symfony 4.0个
这个过程没有从Symfony 3更改为4,但下面是一个使用新推荐的AbstractController
的示例.security.token_storage
和session
服务都在父getSubscribedServices
方法中注册,因此您不必在控制器中添加这些服务.
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use YourNameSpace\UserBundle\Entity\User;
class LoginController extends AbstractController{
public function registerAction()
{
$user = //Handle getting or creating the user entity likely with a posted form
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->container->get('security.token_storage')->setToken($token);
$this->container->get('session')->set('_security_main', serialize($token));
// The user is now logged in, you can redirect or do whatever.
}
}
Symfony 2.6.x - Symfony 3.0.x
从symfony 2.6开始,security.context
已弃用,取而代之的是security.token_storage
.控制器现在可以简单地执行以下操作:
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use YourNameSpace\UserBundle\Entity\User;
class LoginController extends Controller{
public function registerAction()
{
$user = //Handle getting or creating the user entity likely with a posted form
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->get('security.token_storage')->setToken($token);
$this->get('session')->set('_security_main', serialize($token));
}
}
虽然这是不推荐的,但您仍然可以使用security.context
,因为它已被设置为向后兼容.准备好为Symfony 3更新它.
您可以在此处阅读有关2.6版安全更改的更多信息:https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md
Symfony 2.3.x个
要在symfony 2.3中实现这一点,您不能再仅仅在安全上下文中设置令牌.您还需要将令牌保存到会话.
假设安全文件带有防火墙,如:
// app/config/security.yml
security:
firewalls:
main:
//firewall settings here
控制器动作类似于:
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use YourNameSpace\UserBundle\Entity\User;
class LoginController extends Controller{
public function registerAction()
{
$user = //Handle getting or creating the user entity likely with a posted form
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->get('security.context')->setToken($token);
$this->get('session')->set('_security_main',serialize($token));
//Now you can redirect where ever you need and the user will be logged in
}
}
对于令牌创建,您需要创建一个UsernamePasswordToken
.这接受4个参数:用户实体、用户凭据、防火墙名称、用户角色.您不需要提供令牌有效的用户凭据.
如果你只是想马上重定向,我不能security.context
%确定是否有必要将令牌设置为security.context
.但它似乎不疼,所以我把它留下了.
然后是重要的部分,设置会话变量.变量命名约定是_security_
后跟防火墙名称,在本例中是main
加_security_main
.