Symfony 4.0
Цей процес не змінився з символічного 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