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_storagey los sessionservicios están registrados en la matriz getSubscribedServicesmé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.contextestá 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.contextya 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.contextsea 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 mainhaciendo_security_main