Symfony 4.0
Este proceso no ha cambiado de Symfony 3 a 4, pero aquí hay un ejemplo utilizando el AbstractController recomendado recientemente. Tanto las security.token_storage
y los session
servicios están registrados en la matriz getSubscribedServices
método para que no tenga que añadir los de su 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 de Symfony 2.6 security.context
está obsoleto en favor de security.token_storage
. El controlador ahora puede ser simplemente:
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));
}
}
Si bien esto está obsoleto, aún puede usarlo, security.context
ya que se ha hecho para ser compatible con versiones anteriores. Solo prepárate para actualizarlo para Symfony 3
Puede leer más sobre los cambios 2.6 por seguridad aquí: https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md
Symfony 2.3.x
Para lograr esto en Symfony 2.3, ya no puedes simplemente configurar el token en el contexto de seguridad. También debe guardar el token en la sesión.
Suponiendo un archivo de seguridad con un firewall como:
// app/config/security.yml
security:
firewalls:
main:
//firewall settings here
Y una acción de controlador similar también:
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 la creación del token, querrá crear un UsernamePasswordToken
, Esto acepta 4 parámetros: Entidad de usuario, Credenciales de usuario, Nombre del firewall, Roles de usuario. No es necesario que proporcione las credenciales de usuario para que el token sea válido.
No estoy 100% seguro de que security.context
sea necesario configurar el token en el si solo va a redireccionar de inmediato. Pero no parece doler, así que lo dejé.
Luego, la parte importante, configurar la variable de sesión. La convención de nomenclatura de variables es _security_
seguida por el nombre de su firewall, en este caso main
haciendo_security_main