Jak sprawdzić, czy użytkownik jest zalogowany w Symfony2 wewnątrz kontrolera?

Przeczytałem tutaj Jak sprawdzić status logowania użytkownika za pomocą szablonu gałązki dla strony opartej na Symfony2. Muszę jednak wiedzieć, jak sprawdzić, czy użytkownik jest zalogowany z poziomu kontrolera. Byłem całkiem pewien, że następujący kod miał rację:

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

Ale zawsze coś zwraca, np. zalogowanego użytkownika lub anonimowego użytkownika.

Jakiś pomysł? Z góry dzięki.
Author: Community, 2012-04-22

7 answers

Warning : samo sprawdzanie 'IS_AUTHENTICATED_FULLY' zwróci false, jeśli użytkownik zalogował się za pomocą funkcji" Zapamiętaj mnie".

Zgodnie z dokumentacją Symfony 2 istnieją 3 możliwości:

IS_AUTHENTICATED_ANONYMOUSLY - automatycznie przypisywany do użytkownika, który jest w firewall chronionej części witryny, ale kto nie ma w rzeczywistości zalogowany. Jest to możliwe tylko wtedy, gdy zezwolono na dostęp anonimowy.

IS_AUTHENTICATED_REMEMBERED - automatycznie przypisany do użytkownika, który był uwierzytelnione za pomocą ciasteczek remember me.

IS_AUTHENTICATED_FULLY - automatycznie przypisany do użytkownika, który ma podali swoje dane logowania podczas bieżącej sesji.

Te role reprezentują trzy poziomy uwierzytelniania:

Jeśli masz rolę IS_AUTHENTICATED_REMEMBERED, to masz również rola IS_AUTHENTICATED_ANONYMOUSLY. Jeśli masz IS_AUTHENTICATED_FULLY rola, wtedy masz też dwie pozostałe role. Innymi słowy, role te reprezentują trzy poziomy wzrostu "Siła" uwierzytelniania.

Napotkałem problem, w którym użytkownicy naszego systemu, którzy używali funkcji "Zapamiętaj mnie", byli traktowani tak, jakby w ogóle nie byli zalogowani na stronach, które sprawdzały tylko 'IS_AUTHENTICATED_FULLY'.

Jeśli nie są w pełni uwierzytelnione, należy je ponownie zalogować, lub sprawdzić, czy zapamiętana rola jest zapamiętana.]}
$securityContext = $this->container->get('security.authorization_checker');
if ($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
    // authenticated REMEMBERED, FULLY will imply REMEMBERED (NON anonymous)
}

Miejmy nadzieję, że to kogoś uratuje od popełnienia tego samego błędu co ja. Użyłem tego posta jako odniesienia, gdy szukałem, jak sprawdzić, czy ktoś był zalogowany, czy nie na Symfony 2.

Źródło: http://symfony.com/doc/2.3/cookbook/security/remember_me.html#forcing-the-user-to-re-authenticate-before-accessing-certain-resources

 151
Author: Bryson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-02 07:55:54

SecurityContext będzie przestarzały w Symfony 3.0

Przed Symfony 2.6 należy użyć SecurityContext.
SecurityContext zostanie wycofana w Symfony 3.0 na rzecz AuthorizationChecker.

Na Symfony 2.6+ & Symfony 3.0 użycie AuthorizationChecker.


Symfony 2.6 (i poniżej)

// 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+ (oraz z Symfony 2.6+)

security.context staje się security.authorization_checker.
Teraz otrzymujemy nasz token z security.token_storage zamiast 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

Czytaj więcej tutaj w the docs: AuthorizationChecker
Jak to zrobić w gałązce?: Symfony 2: Jak sprawdzić, czy użytkownik nie jest zalogowany w szablonie?

 56
Author: Anil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:02

Spróbuj tego:

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

Dalsze informacje:

"anonimowi użytkownicy są technicznie uwierzytelnieni, co oznacza, że metoda isauthenticated () obiektu anonimowego użytkownika zwróci true. Aby sprawdzić, czy użytkownik jest rzeczywiście uwierzytelniony, sprawdź IS_AUTHENTICATED_FULLY role."

Źródło: http://symfony.com/doc/current/book/security.html

 46
Author: Lorenzo Marcon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-22 20:05:21

Jeśli używasz adnotacji bezpieczeństwa z SensioFrameworkExtraBundle, możesz użyć kilku wyrażeń (które są zdefiniowane w \Symfony\Component\Security\Core\Authorization\ExpressionLanguageProvider):

  • @Security("is_authenticated()"): aby sprawdzić, czy użytkownik jest authed, a nie anonimowy
  • @Security("is_anonymous()"): aby sprawdzić, czy bieżącym użytkownikiem jest użytkownik anonimowy
  • @Security("is_fully_authenticated()"): odpowiednik is_granted('IS_AUTHENTICATED_FULLY')
  • @Security("is_remember_me()"): odpowiednik is_granted('IS_AUTHENTICATED_REMEMBERED')
 7
Author: magnetik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 08:35:45

Aby dodać do odpowiedzi udzielonej przez anila, w symfony3, możesz użyć $this->getUser(), aby określić, czy użytkownik jest zalogowany, wystarczy prosty warunek, taki jak if(!$this->getUser()) {}.

Jeśli spojrzysz na kod źródłowy, który jest dostępny w kontrolerze bazowym, robi dokładnie to samo, co zdefiniowany przez anila.

 6
Author: Ibrahim Azhar Armar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-11 08:47:42

Jeśli używasz ról, możesz sprawdzić ROLE_USER to jest rozwiązanie, którego używam:

if (TRUE === $this->get('security.authorization_checker')->isGranted('ROLE_USER')) {
    // user is logged in
} 
 6
Author: Redwan Nassim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 13:58:34

Dobrze jest Rozszerzyć z baseController i zaimplementować kilka podstawowych funkcji zaimplementuj funkcję, aby sprawdzić, czy instancja użytkownika jest null w ten sposób jeśli użytkownik tworzy Userinterface, to nie ma zalogowanego użytkownika

/**

*/
class BaseController extends AbstractController
{

    /**
     * @return User

     */
    protected function getUser(): ?User
    {
        return parent::getUser();
    }

    /**
     * @return bool
     */
    protected function isUserLoggedIn(): bool
    {
        return $this->getUser() instanceof User;
    }
}
 0
Author: Mike Smit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-18 05:50:57