Symfony 4.0
Этот процесс не изменился с Symfony 3 на 4, но вот пример использования недавно рекомендованного AbstractController.Службы security.token_storage
и session
зарегистрированы в родительском методе getSubscribedServices
, поэтому вам не нужно добавлять их в свой контроллер.
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
Начиная с Symfony 2.6 security.context
устарела в пользу security.token_storage
.Контроллер теперь может быть просто:
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));
}
}
Несмотря на то, что это устарело, вы все равно можете использовать security.context
, поскольку оно было сделано для обратной совместимости.Просто будьте готовы обновить его для Symfony 3
Подробнее об изменениях 2.6 для безопасности вы можете прочитать здесь: https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md
Symfony 2.3.x
Чтобы выполнить это в Symfony 2.3, вы больше не можете просто установить токен в контексте безопасности.Вам также необходимо сохранить токен в сеансе.
Предполагается, что файл безопасности с брандмауэром выглядит так:
// app/config/security.yml
security:
firewalls:
main:
//firewall settings here
И действие контроллера аналогично:
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
}
}
Для создания токена вы захотите создать UsernamePasswordToken
, который принимает 4 параметра: имя пользователя, учетные данные пользователя, имя брандмауэра, роли пользователя.Вам не нужно указывать учетные данные пользователя, чтобы токен был действительным.
Я не уверен на 100%, что установка токена на security.context
необходима, если вы просто собираетесь перенаправить прямо сейчас.Но, похоже, это не больно, поэтому я оставил его.
Затем важная часть, установка переменной сеанса.Соглашение об именовании переменных: _security_
, за которым следует имя вашего брандмауэра, в этом случае main
делает _security_main