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
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个参数:用户实体,用户凭据,防火墙名称,用户角色。您不需要提供令牌有效的用户凭据。
我不是100%确保设置在security.context的令牌是必要的,如果你只是要立即重定向。但它似乎没有伤害,所以我离开了它。
然后重要的部分,设置会话变量。变量命名约定是_security_,后面是您的防火墙名称,在这种情况下,主要使用_security_main