Symfony 4.0
Ce processus n'a pas changé de symfony 3 à 4 mais voici un exemple utilisant le nouveau AbstractController recommandé. Les deuxsecurity.token_storage
session
services et les services sont enregistrés dans la getSubscribedServices
méthode parente , vous n'avez donc pas à les ajouter dans votre contrôleur.
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
À partir de symfony 2.6 security.context
est obsolète au profit de security.token_storage
. Le contrôleur peut maintenant être simplement:
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));
}
}
Bien que cela soit obsolète, vous pouvez toujours l'utiliser security.context
car il a été conçu pour être rétrocompatible. Soyez juste prêt à le mettre à jour pour Symfony 3
Vous pouvez en savoir plus sur les changements 2.6 pour la sécurité ici: https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md
Symfony 2.3.x
Pour accomplir cela dans symfony 2.3, vous ne pouvez plus simplement définir le jeton dans le contexte de sécurité. Vous devez également enregistrer le jeton dans la session.
En supposant un fichier de sécurité avec un pare-feu comme:
// app/config/security.yml
security:
firewalls:
main:
//firewall settings here
Et une action de contrôleur similaire aussi:
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
}
}
Pour la création du jeton, vous voudrez créer un UsernamePasswordToken
, Cela accepte 4 paramètres: entité utilisateur, informations d'identification de l'utilisateur, nom du pare-feu, rôles d'utilisateur. Vous n'avez pas besoin de fournir les informations d'identification de l'utilisateur pour que le jeton soit valide.
Je ne suis pas sûr à 100% que la définition du jeton sur le security.context
soit nécessaire si vous allez simplement rediriger tout de suite. Mais cela ne semble pas faire mal, donc je l'ai laissé.
Ensuite, la partie importante, la définition de la variable de session. Les variables convention de nommage est _security_
suivi de votre nom pare - feu, dans ce cas , la main
prise_security_main