Symfony 4.0
Dieser Prozess hat sich nicht von Symfony 3 auf 4 geändert, aber hier ist ein Beispiel mit dem neu empfohlenen AbstractController. Sowohl der security.token_storage
als auch der session
Dienst sind in der übergeordneten getSubscribedServices
Methode registriert , sodass Sie diese nicht in Ihrem Controller hinzufügen müssen.
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.
Ab Symfony ist 2.6 security.context
zugunsten von veraltet security.token_storage
. Der Controller kann jetzt einfach sein:
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));
}
}
Obwohl dies veraltet ist, können Sie es weiterhin verwenden, security.context
da es abwärtskompatibel ist. Seien Sie einfach bereit, es für Symfony 3 zu aktualisieren
Weitere Informationen zu den 2.6-Sicherheitsänderungen finden Sie hier: https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md
Symfony 2.3.x.
Um dies in Symfony 2.3 zu erreichen, können Sie das Token nicht mehr nur im Sicherheitskontext festlegen. Sie müssen das Token auch in der Sitzung speichern.
Angenommen, eine Sicherheitsdatei mit einer Firewall wie:
// app/config/security.yml
security:
firewalls:
main:
//firewall settings here
Und eine ähnliche Controller-Aktion:
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
}
}
Für die Token-Erstellung möchten Sie Folgendes erstellen UsernamePasswordToken
: Dies akzeptiert 4 Parameter: Benutzerentität, Benutzeranmeldeinformationen, Firewall-Name, Benutzerrollen. Sie müssen die Benutzeranmeldeinformationen nicht angeben, damit das Token gültig ist.
Ich bin nicht 100% sicher, dass das Setzen des Tokens auf dem security.context
notwendig ist, wenn Sie nur sofort umleiten wollen. Aber es scheint nicht weh zu tun, also habe ich es verlassen.
Dann der wichtige Teil, das Setzen der Sitzungsvariablen. Die Variablen Namenskonvention wird _security_
von der Firewall Namen, in diesem Fall gefolgt main
Herstellung_security_main