Wie überprüfe ich, ob ein Benutzer in Symfony2 in einem Controller angemeldet ist?

Ich lese hier, wie man den Login-Status eines Benutzers in einer Zweig-Vorlage für eine Symfony2-basierte Website überprüft. Ich muss jedoch wissen, wie überprüft werden kann, ob der Benutzer von einem Controller aus angemeldet ist. Ich war mir ziemlich sicher, dass der folgende Code richtig war:

$user = $this->get('security.context')->getToken()->getUser(); 

aber es gibt immer etwas zurück, zB einen angemeldeten Benutzer oder einen anonymen Benutzer.

Irgendeine Idee? Danke im Voraus.

Warnung : 'IS_AUTHENTICATED_FULLY' nach 'IS_AUTHENTICATED_FULLY' wird false zurückgegeben, wenn der Benutzer sich mit der function “Remember me” angemeldet hat.

Laut Symfony 2 Dokumentation gibt es 3 Möglichkeiten:

IS_AUTHENTICATED_ANONYMOUSLY – wird automatisch einem Benutzer zugewiesen, der sich in einem durch die Firewall geschützten Teil der Site befindet, der sich jedoch nicht angemeldet hat. Dies ist nur möglich, wenn der anonyme Zugriff zugelassen wurde.

IS_AUTHENTICATED_REMEMBEREDWird automatisch einem Benutzer zugewiesen, der über einen Cookie “remember me” authentifiziert wurde.

IS_AUTHENTICATED_FULLY – wird automatisch einem Benutzer zugewiesen, der während der aktuellen Sitzung seine Anmeldedaten angegeben hat.

Diese Rollen repräsentieren drei Authentifizierungsebenen:

Wenn Sie die Rolle IS_AUTHENTICATED_REMEMBERED , haben Sie auch die Rolle IS_AUTHENTICATED_ANONYMOUSLY . Wenn Sie die Rolle IS_AUTHENTICATED_FULLY , haben Sie auch die anderen beiden Rollen. Mit anderen Worten, diese Rollen repräsentieren drei Stufen zunehmender “Stärke” der Authentifizierung.

Ich stieß auf ein Problem, bei dem Benutzer unseres Systems, die “Remember Me” -functionalität verwendet hatten, so behandelt wurden, als wären sie überhaupt nicht auf Seiten eingeloggt, die nur nach 'IS_AUTHENTICATED_FULLY' .

Die Antwort lautet dann, dass sie sich erneut anmelden müssen, wenn sie nicht vollständig authentifiziert sind, oder nach der gespeicherten Rolle suchen:

 $securityContext = $this->container->get('security.authorization_checker'); if ($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) { // authenticated REMEMBERED, FULLY will imply REMEMBERED (NON anonymous) } 

Hoffentlich wird das jemanden da draußen davor bewahren, denselben Fehler zu machen, den ich gemacht habe. Ich habe diesen Post als Referenz verwendet, als ich nachgesehen habe, wie man überprüft, ob jemand bei Symfony 2 angemeldet ist oder nicht.

Quelle: http://symfony.com/doc/2.3/cookbook/security/remember_me.html#forcing-the-user-to-re-authenticate-before-accessing-certain-resources

SecurityContext wird in Symfony 3.0

Vor Symfony 2.6 Sie SecurityContext .
SecurityContext wird in Symfony 3.0 zugunsten des AuthorizationChecker veraltet.

Für Symfony 2.6+ und Symfony 3.0 verwenden Sie AuthorizationChecker .


Symfony 2.6 (und unten)

 // Get our Security Context Object - [deprecated in 3.0] $security_context = $this->get('security.context'); # eg: $security_context->isGranted('ROLE_ADMIN'); // Get our Token (representing the currently logged in user) $security_token = $security_context->getToken(); # eg: $security_token->getUser(); # eg: $security_token->isAuthenticated(); # [Careful] ^ "Anonymous users are technically authenticated" // Get our user from that security_token $user = $security_token->getUser(); # eg: $user->getEmail(); $user->isSuperAdmin(); $user->hasRole(); // Check for Roles on the $security_context $isRoleAdmin = $security_context->isGranted('ROLE_ADMIN'); # eg: (bool) true/false 

Symfony 3.0+ (und von Symfony 2.6+)

security.context wird zu security.authorization_checker .
Wir bekommen jetzt unser Token von security.token_storage anstelle von security.context

 // [New 3.0] Get our "authorization_checker" Object $auth_checker = $this->get('security.authorization_checker'); # eg: $auth_checker->isGranted('ROLE_ADMIN'); // Get our Token (representing the currently logged in user) // [New 3.0] Get the `token_storage` object (instead of calling upon `security.context`) $token = $this->get('security.token_storage')->getToken(); # eg: $token->getUser(); # eg: $token->isAuthenticated(); # [Careful] ^ "Anonymous users are technically authenticated" // Get our user from that token $user = $token->getUser(); # eg (w/ FOSUserBundle): $user->getEmail(); $user->isSuperAdmin(); $user->hasRole(); // [New 3.0] Check for Roles on the $auth_checker $isRoleAdmin = $auth_checker->isGranted('ROLE_ADMIN'); // eg: (bool) true/false 

Lesen Sie hier mehr in der Dokumentation: AuthorizationChecker
Wie geht das im Zweig ?: Symfony 2: Wie überprüfe ich, ob ein Benutzer nicht in einer Vorlage angemeldet ist?

Versuche dies:

 if( $this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') ){ // authenticated (NON anonymous) } 

Weitere Informationen:

“Anonyme Benutzer sind technisch authentifiziert, was bedeutet, dass die Methode isAuthenticated () eines anonymen Benutzerobjekts true zurückgibt. Um zu überprüfen, ob Ihr Benutzer tatsächlich authentifiziert ist, überprüfen Sie die Rolle IS_AUTHENTICATED_FULLY.”

Quelle: http://symfony.com/doc/current/book/security.html

Wenn Sie Sicherheitsanmerkungen aus dem SensioFrameworkExtraBundle , können Sie einige Ausdrücke verwenden (die in \Symfony\Component\Security\Core\Authorization\ExpressionLanguageProvider ):

  • @Security("is_authenticated()") : um zu überprüfen, ob der Benutzer authentifiziert und nicht anonym ist
  • @Security("is_anonymous()") : um zu überprüfen, ob der aktuelle Benutzer der anonyme Benutzer ist
  • @Security("is_fully_authenticated()") : entspricht is_granted('IS_AUTHENTICATED_FULLY')
  • @Security("is_remember_me()") : entspricht is_granted('IS_AUTHENTICATED_REMEMBERED')

Wenn Sie Rollen verwenden, können Sie nach ROLE_USER , das ist die Lösung, die ich verwende:

 if (TRUE === $this->get('security.authorization_checker')->isGranted('ROLE_USER')) { // user is logged in } 

Um der Antwort von Anil hinzuzufügen , können Sie in symfony3 $this->getUser() um festzustellen, ob der Benutzer eingeloggt ist, eine einfache Bedingung wie if(!$this->getUser()) {} .

Wenn Sie sich den Quellcode anschauen, der im Basis-Controller verfügbar ist, wird genau das Gleiche wie von Anil gemacht.