Symfony 4.0
Este processo não mudou do symfony 3 para 4, mas aqui está um exemplo usando o recém-recomendado AbstractController. Os serviços security.token_storage
e os session
são registrados no getSubscribedServices
método pai , portanto, você não precisa adicioná-los ao seu controlador.
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
A partir do symfony 2.6 security.context
está obsoleto em favor de security.token_storage
. O controlador agora pode ser simplesmente:
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));
}
}
Embora esteja obsoleto, você ainda pode usar security.context
, pois foi feito para ser compatível com versões anteriores. Esteja pronto para atualizá-lo para Symfony 3
Você pode ler mais sobre as mudanças 2.6 para segurança aqui: https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md
Symfony 2.3.x
Para conseguir isso no symfony 2.3, você não pode mais apenas definir o token no contexto de segurança. Você também precisa salvar o token na sessão.
Presumindo um arquivo de segurança com um firewall como:
// app/config/security.yml
security:
firewalls:
main:
//firewall settings here
E uma ação de controle semelhante também:
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
}
}
Para a criação do token, você desejará criar um UsernamePasswordToken
, que aceita 4 parâmetros: Entidade do usuário, Credenciais do usuário, Nome do firewall, Funções do usuário. Você não precisa fornecer as credenciais do usuário para que o token seja válido.
Não tenho 100% de certeza de que definir o token no security.context
seja necessário se você for redirecionar imediatamente. Mas não parece doer, então eu o deixei.
Em seguida, a parte importante, definir a variável de sessão. A convenção variáveis nomeando é _security_
seguido pelo seu nome firewall, neste caso, main
a tomada_security_main