Symfony 4.0
Ten proces nie zmienił się z symfony 3 na 4, ale tutaj jest przykład używający nowo zalecanego AbstractController. Zarówno usługa, jak security.token_storage
i session
usługi są zarejestrowane w getSubscribedServices
metodzie nadrzędnej , więc nie musisz ich dodawać w kontrolerze.
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
Od Symfony 2.6 security.context
jest przestarzałe na korzyść security.token_storage
. Teraz kontroler może być po prostu:
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));
}
}
Chociaż jest to przestarzałe, nadal możesz z niego korzystać, security.context
ponieważ zostało utworzone jako zgodne z poprzednimi wersjami. Po prostu bądź gotowy, aby zaktualizować go do Symfony 3
Możesz przeczytać więcej o zmianach w 2.6 dla bezpieczeństwa tutaj: https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md
Symfony 2.3.x
Aby to osiągnąć w symfony 2.3, nie możesz już po prostu ustawić tokena w kontekście bezpieczeństwa. Musisz również zapisać token w sesji.
Zakładając plik bezpieczeństwa z zaporą ogniową, taką jak:
// app/config/security.yml
security:
firewalls:
main:
//firewall settings here
A akcja kontrolera też jest podobna:
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
}
}
Aby utworzyć token, będziesz chciał utworzyć UsernamePasswordToken
, To akceptuje 4 parametry: Jednostka użytkownika, Poświadczenia użytkownika, Nazwa zapory, Role użytkownika. Nie musisz podawać poświadczeń użytkownika, aby token był ważny.
Nie jestem w 100% pewien, czy ustawienie tokena na to security.context
jest konieczne, jeśli zamierzasz od razu przekierować. Ale to nie wydaje się boleć, więc zostawiłem to.
Następnie ważna część, ustawienie zmiennej sesji. Po konwencji nazewnictwa zmiennych _security_
następuje nazwa zapory, w tym przypadku main
tworzona_security_main