Ich habe hier gelesen , wie Sie den Anmeldestatus eines Benutzers anhand einer Zweigvorlage für eine Symfony2-basierte Website überprüfen können. Ich muss jedoch wissen, wie ich überprüfen kann, ob der Benutzer innerhalb eines Controllers angemeldet ist. Ich war mir ziemlich sicher, dass der folgende Code richtig war:
$user = $this->get('security.context')->getToken()->getUser();
Es wird jedoch immer etwas zurückgegeben, z. B. ein protokollierter Benutzer oder ein anonymer Benutzer.
Irgendeine Idee? Danke im Voraus.
symfony
login
symfony-security
Jean Valjean
quelle
quelle
Antworten:
Warnung :
'IS_AUTHENTICATED_FULLY'
Wenn Sie nur nach prüfen, wird false zurückgegeben, wenn sich der Benutzer mit der Funktion "Angemeldet bleiben" angemeldet hat.Laut Symfony 2-Dokumentation gibt es drei Möglichkeiten:
Diese Rollen repräsentieren drei Authentifizierungsebenen:
Ich bin auf ein Problem gestoßen, bei dem Benutzer unseres Systems, die die Funktion "Angemeldet bleiben" verwendet hatten, so behandelt wurden, als hätten sie sich auf Seiten, auf die nur geprüft wurde, überhaupt nicht angemeldet
'IS_AUTHENTICATED_FULLY'
.Die Antwort besteht dann darin, dass sie sich erneut anmelden müssen, wenn sie nicht vollständig authentifiziert sind, oder nach der gespeicherten Rolle suchen müssen:
$securityContext = $this->container->get('security.authorization_checker'); if ($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) { // authenticated REMEMBERED, FULLY will imply REMEMBERED (NON anonymous) }
Hoffentlich wird dies jemanden da draußen davor bewahren, den gleichen Fehler zu machen, den ich gemacht habe. Ich habe genau diesen Beitrag als Referenz verwendet, um zu überprüfen, ob jemand bei Symfony 2 angemeldet war oder nicht.
Quelle: http://symfony.com/doc/2.3/cookbook/security/remember_me.html#forcing-the-user-to-re-authenticate-before-accessing-certain-resources
quelle
$securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')
, da die Rollen hierarchisch sind. DasIS_AUTHENTICATED_FULLY
bedeutet also, dass der Benutzer auch hatIS_AUTHENTICATED_REMEMBERED
.IS_AUTHENTICATED_FULLY
auch garantiert, dass ein Benutzer hatIS_AUTHENTICATED_REMEMBERED
, müssen Sie immer nur nach suchenIS_AUTHENTICATED_REMEMBERED
.$this->container->get('security.authorization_checker')
stattdessen (neu in 2.6)SecurityContext wird in veraltet sein
Symfony 3.0
Bevor
Symfony 2.6
Sie verwenden würdenSecurityContext
.SecurityContext
wirdSymfony 3.0
zugunsten der abgelehntAuthorizationChecker
.Für
Symfony 2.6+
&Symfony 3.0
VerwendungAuthorizationChecker
.Symfony 2.6 (und darunter)
// 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.context
wirdsecurity.authorization_checker
.Wir bekommen jetzt unseren Token von
security.token_storage
anstelle vonsecurity.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
Lesen Sie hier mehr in den Dokumenten: Wie geht das im Zweig?: Symfony 2: Wie überprüfe ich, ob ein Benutzer nicht in einer Vorlage angemeldet ist?
AuthorizationChecker
quelle
Controller
Sie einfach schreiben$this->isGranted($role, $obj, $errMsg)
. DiedenyAccessUnlessGranted()
Funktion und dieisGranted()
Funktionen sind nur Verknüpfungen, umisGranted()
densecurity.authorization_checker
Dienst aufzurufen .Versuche dies:
if( $this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') ){ // authenticated (NON anonymous) }
Weitere Informationen:
Quelle: http://symfony.com/doc/current/book/security.html
quelle
$this->container->get('security.authorization_checker')
stattdessen (neu in 2.6)Wenn Sie Sicherheitsanmerkungen aus dem verwenden
SensioFrameworkExtraBundle
, können Sie einige Ausdrücke verwenden (die in definiert sind\Symfony\Component\Security\Core\Authorization\ExpressionLanguageProvider
):@Security("is_authenticated()")
: um zu überprüfen, ob der Benutzer autorisiert und nicht anonym ist@Security("is_anonymous()")
: um zu überprüfen, ob der aktuelle Benutzer der anonyme Benutzer ist@Security("is_fully_authenticated()")
: gleichwertigis_granted('IS_AUTHENTICATED_FULLY')
@Security("is_remember_me()")
: gleichwertigis_granted('IS_AUTHENTICATED_REMEMBERED')
quelle
Um die von Anil gegebene Antwort zu ergänzen , können Sie in symfony3 mithilfe
$this->getUser()
einer einfachen Bedingung bestimmen, ob der Benutzer angemeldet istif(!$this->getUser()) {}
.Wenn Sie sich den Quellcode ansehen, der im Basis-Controller verfügbar ist, funktioniert er genau so, wie er von Anil definiert wurde.
quelle
Wenn Sie Rollen verwenden, können Sie überprüfen,
ROLE_USER
ob dies die Lösung ist, die ich verwende:if (TRUE === $this->get('security.authorization_checker')->isGranted('ROLE_USER')) { // user is logged in }
quelle
ROLE_USER
zugewiesen. Nicht alle Apps tun dies.