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