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_storageals auch der sessionDienst sind in der übergeordneten getSubscribedServicesMethode 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.contextzugunsten 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.contextda 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.contextnotwendig 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 mainHerstellung_security_main