2012-04-22 1 views
66

Ich lese here, wie Sie den Anmeldestatus eines Benutzers innerhalb einer Zweigvorlage für eine Symfony2-basierte Website überprüfen. Ich muss jedoch wissen, wie überprüft werden kann, ob der Benutzer von einem Controller aus angemeldet ist. Ich war ziemlich sicher, dass der folgende Code richtig war:Wie überprüft man, ob ein Benutzer in Symfony2 in einem Controller angemeldet ist?

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

aber es immer etwas, z. ein angemeldeter Benutzer oder ein anonymer Benutzer.

Irgendeine Idee? Danke im Voraus.

+0

können Sie nicht überprüfen, ob $ user! = "Anon."? –

+0

Nun, ich war auf der Suche nach etwas "sicherer". Ist nicht eine andere Art, d. H. Eine Funktion zu nennen? – JeanValjean

Antwort

136

Warnung: Prüfung auf 'IS_AUTHENTICATED_FULLY' allein wird falsch zurück, wenn der Benutzer mit "Remember me" -Funktionalität angemeldet hat.

Nach Symfony 2-Dokumentation gibt es 3 Möglichkeiten:

IS_AUTHENTICATED_ANONYMOUSLY - automatisch einen Benutzer zugewiesen, die in einer Firewall geschützten Teil der Website ist aber in nicht wirklich angemeldet hat. Dies ist nur möglich, wenn der anonyme Zugriff erlaubt ist.

IS_AUTHENTICATED_REMEMBERED - automatisch an einen Benutzer, der über ein Cookie erinnere mich authentifiziert wurde zugewiesen.

IS_AUTHENTICATED_FULLY - automatisch einen Benutzer zugewiesen, der hat ihre Login-Daten während der aktuellen Sitzung zur Verfügung gestellt.

Diese Rollen stellen drei Ebenen der Authentifizierung:

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

Ich lief in ein Problem, bei dem Nutzer unseres Systems, die „Remember Me“ -Funktion benutzt hatte, wurde behandelt, als ob sie in überhaupt auf den Seiten nicht angemeldet hatten, die nur für 'IS_AUTHENTICATED_FULLY' geprüft.

Die Antwort dann ist sie benötigen, um erneut anmelden, wenn sie nicht vollständig authentifiziert sind, oder für die Erinnerung Rolle zu überprüfen:

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

Hoffentlich dies jemand da draußen retten den gleichen Fehler aus machen Ich machte. Ich habe diese sehr Beitrag als Referenz, wenn die oben schaut, wie Sie überprüfen, ob jemand in oder nicht auf Symfony angemeldet wurde 2.

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

+4

Eigentlich könnten Sie einfach '$ securityContext-> isGranted ('IS_AUTHENTICATED_REMEMBERED')' verwenden, da die Rollen hierarchisch sind. Wenn "IS_AUTHENTICATED_FULLY" vorliegt, bedeutet dies, dass der Benutzer auch "IS_AUTHENTICATED_REMEMBERED" hat. – theunraveler

+3

Nicht wahr. IS_AUTHENTICATED_REMEMBERED gibt nur dann true zurück, wenn der Benutzer die Funktion "Remember me" verwendet. IS_AUTHENTICATED_FULLY bedeutet IS_AUTHENTICATED_REMEMBERED, aber nicht umgekehrt. – Bryson

+4

Rechts. Wenn 'IS_AUTHENTICATED_FULLY' auch garantiert, dass ein Benutzer 'IS_AUTHENTICATED_REMEMBERED' hat, dann müssen Sie immer nach 'IS_AUTHENTICATED_REMEMBERED' suchen. – theunraveler

45

Versuchen Sie folgendes:

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

. Weitere Informationen:

„Anonyme Benutzer technisch authentifiziert werden, was bedeutet, dass die IsAuthenticated() -Methode eines anonymen Benutzerobjekt wahr zurück Um zu überprüfen, Wenn Ihr Benutzer tatsächlich authentifiziert ist, suchen Sie nach der IS_AUTHENTICATED_FULLY-Rolle. "

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

+0

Ja! Es funktioniert ... vielen Dank! Denkst du aber, dass der $ user! = "Anon." ist sicher genug? Ich befürchte, dass eine neue Version den Wert eines anonymen Benutzers ändern könnte! Ist das nicht möglich? – JeanValjean

+2

Nun .. da es diese Lösung von Symfony gibt, würde ich vorschlagen, dass Sie diese verwenden (isGranted). Ich denke nicht, dass sie das Verhalten einer solchen grundlegenden Funktion wie die Sicherheitskomponente ändern werden. Die Verwendung von isGranted ist übrigens weitaus professioneller und sauberer als ein einfacher String-Vergleich. –

+0

Nochmals vielen Dank für die vollständige Antwort! – JeanValjean

5

Wenn Sie Rollen, die Sie für ROLE_USER überprüfen konnte , dass die Lösung ich benutze:

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

Angenommen, Ihre App weist jedem Benutzer 'ROLE_USER' zu. Nicht alle Apps. – Brian

49

Security wird in Symfony 3.0

Vor Symfony 2.6 Sieverwenden würde veraltet.
SecurityContext wird in Symfony 3.0 zugunsten der AuthorizationChecker veraltet sein.

Für Symfony 2.6+ & Symfony 3.0 Verwendung AuthorizationChecker.


Symfony 2,6 (und unterhalb)

// Get our Security Context Object - [deprecated in 3.0] 
$security_context = $this->get('security.context'); 
# e.g: $security_context->isGranted('ROLE_ADMIN'); 

// Get our Token (representing the currently logged in user) 
$security_token = $security_context->getToken(); 
# e.g: $security_token->getUser(); 
# e.g: $security_token->isAuthenticated(); 
# [Careful]   ^"Anonymous users are technically authenticated" 

// Get our user from that security_token 
$user = $security_token->getUser(); 
# e.g: $user->getEmail(); $user->isSuperAdmin(); $user->hasRole(); 

// Check for Roles on the $security_context 
$isRoleAdmin = $security_context->isGranted('ROLE_ADMIN'); 
# e.g: (bool) true/false 

Symfony 3.0+ (und von Symfony 2.6+)

security.contextsecurity.authorization_checker wird.
Wir bekommen jetzt unsere Token von security.token_storage anstelle des security.context

// [New 3.0] Get our "authorization_checker" Object 
$auth_checker = $this->get('security.authorization_checker'); 
# e.g: $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(); 
# e.g: $token->getUser(); 
# e.g: $token->isAuthenticated(); 
# [Careful]   ^"Anonymous users are technically authenticated" 

// Get our user from that token 
$user = $token->getUser(); 
# e.g (w/ FOSUserBundle): $user->getEmail(); $user->isSuperAdmin(); $user->hasRole(); 

// [New 3.0] Check for Roles on the $auth_checker 
$isRoleAdmin = $auth_checker->isGranted('ROLE_ADMIN'); 
// e.g: (bool) true/false 

mehr hier in der Dokumentation lesen: AuthorizationChecker
Wie dies in Zweig ?: tun Symfony 2: How do I check if a user is not logged in inside a template?

+2

In Symfony 'Controller' können Sie einfach' $ this-> isGranted ($ role, $ obj, $ errMsg) '' schreiben. Die 'denyAccessUnlessGranted()' -Funktion und die 'isGranted()' -Funktionen sind beide nur Verknüpfungen zum Aufruf von 'isGranted()' auf dem 'security.authorization_checker'-Dienst. – Mehulkumar

5

Wenn Sie verwenden Sicherheit Anmerkung aus der SensioFrameworkExtraBundle, können Sie ein paar Ausdrücke verwenden (die in \Symfony\Component\Security\Core\Authorization\ExpressionLanguageProvider definiert sind):

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

    Um die Antwort von Anil, in symfony3 hinzuzufügen, können Sie $this->getUser() zu bestimmen Wenn der Benutzer angemeldet ist, genügt eine einfache Bedingung wie if(!$this->getUser()) {}.

    Wenn Sie sich den Quellcode ansehen, der im Basis-Controller verfügbar ist, wird genau das gleiche wie von Anil definiert.