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