Symfony 4.0
Questo processo non è cambiato da symfony 3 a 4 ma ecco un esempio che usa il nuovo AbstractController raccomandato. Sia il servizio che security.token_storage
i session
servizi sono registrati nel getSubscribedServices
metodo genitore , quindi non è necessario aggiungerli nel controller.
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 partire da symfony 2.6 security.context
è deprecato a favore di security.token_storage
. Il controller può ora essere semplicemente:
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));
}
}
Sebbene sia deprecato, puoi comunque utilizzare security.context
poiché è stato creato per essere retrocompatibile. Basta essere pronti per aggiornarlo per Symfony 3
Puoi leggere di più sulle modifiche 2.6 per la sicurezza qui: https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md
Symfony 2.3.x
Per ottenere ciò in symfony 2.3 non puoi più semplicemente impostare il token nel contesto di sicurezza. È inoltre necessario salvare il token nella sessione.
Supponendo un file di sicurezza con un firewall come:
// app/config/security.yml
security:
firewalls:
main:
//firewall settings here
E anche un'azione del controller simile:
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
}
}
Per la creazione del token si desidera creare un UsernamePasswordToken
, Questo accetta 4 parametri: Entità utente, Credenziali utente, Nome firewall, Ruoli utente. Non è necessario fornire le credenziali utente affinché il token sia valido.
Non sono sicuro al 100% che impostare il token su security.context
sia necessario se stai per reindirizzare immediatamente. Ma non sembra ferire, quindi l'ho lasciato.
Poi la parte importante, l'impostazione della variabile di sessione. La convenzione di denominazione delle variabili è _security_
seguita dal nome del firewall, in questo caso main
making_security_main