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_storagei sessionservizi sono registrati nel getSubscribedServicesmetodo 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.contextsia 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 mainmaking_security_main