password - symfony hash
¿Cómo verificar si un usuario está conectado a Symfony2 dentro de un controlador? (6)
SecurityContext quedará obsoleto en Symfony 3.0
Antes de Symfony 2.6
usaría SecurityContext
.
SecurityContext
quedará obsoleto en Symfony 3.0
a favor de AuthorizationChecker
.
Para Symfony 2.6+
y Symfony 3.0
usa AuthorizationChecker
.
Symfony 2.6 (y abajo)
// 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+ (y desde Symfony 2.6+)
security.context
convierte en security.authorization_checker
.
Ahora obtenemos nuestro token de security.token_storage
lugar del 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
Lea más aquí en los documentos: AuthorizationChecker
¿Cómo hacer esto en twig ?: Symfony 2: ¿Cómo puedo verificar si un usuario no ha iniciado sesión dentro de una plantilla?
Leí here cómo verificar el estado de inicio de sesión de un usuario dentro de una plantilla twig para un sitio web basado en Symfony2. Sin embargo, necesito saber cómo verificar si el usuario ha iniciado sesión desde dentro de un controlador. Estaba bastante seguro de que el siguiente código era correcto:
$user = $this->get(''security.context'')->getToken()->getUser();
pero siempre devuelve algo, por ejemplo, un usuario registrado o un usuario anónimo.
¿Alguna idea? Gracias por adelantado.
Para agregar a la respuesta dada por Anil, en symfony3 , puede usar $this->getUser()
para determinar si el usuario está conectado, una condición simple como if(!$this->getUser()) {}
hará.
Si miras el código fuente que está disponible en el controlador base, hace exactamente lo mismo definido por Anil.
Prueba esto:
if( $this->container->get(''security.context'')->isGranted(''IS_AUTHENTICATED_FULLY'') ){
// authenticated (NON anonymous)
}
Más información:
"Los usuarios anónimos están técnicamente autenticados, lo que significa que el método isAuthenticated () de un objeto de usuario anónimo devolverá true. Para verificar si su usuario está realmente autenticado, busque la función IS_AUTHENTICATED_FULLY".
Si está utilizando la anotación de seguridad de SensioFrameworkExtraBundle
, puede usar algunas expresiones (que están definidas en /Symfony/Component/Security/Core/Authorization/ExpressionLanguageProvider
):
-
@Security("is_authenticated()")
: para verificar que el usuario esté autenticado y no anónimo -
@Security("is_anonymous()")
: para comprobar si el usuario actual es el usuario anónimo -
@Security("is_fully_authenticated()")
: equivalente ais_granted(''IS_AUTHENTICATED_FULLY'')
-
@Security("is_remember_me()")
: equivalente ais_granted(''IS_AUTHENTICATED_REMEMBERED'')
Si usa roles, puede verificar ROLE_USER
que es la solución que uso:
if (TRUE === $this->get(''security.authorization_checker'')->isGranted(''ROLE_USER'')) {
// user is logged in
}
Advertencia : si se comprueba solo ''IS_AUTHENTICATED_FULLY''
, se devolverá falso si el usuario ''IS_AUTHENTICATED_FULLY''
sesión con la funcionalidad "Recordarme".
Según la documentación de Symfony 2, hay 3 posibilidades:
IS_AUTHENTICATED_ANONYMOUSLY : se asigna automáticamente a un usuario que se encuentra en una parte protegida del firewall del sitio pero que no ha iniciado sesión realmente. Esto solo es posible si se ha permitido el acceso anónimo.
IS_AUTHENTICATED_REMEMBERED : asignado automáticamente a un usuario que fue autenticado a través de una cookie recordarme.
IS_AUTHENTICATED_FULLY : se asigna automáticamente a un usuario que proporcionó sus datos de inicio de sesión durante la sesión actual.
Esos roles representan tres niveles de autenticación:
Si tiene el rol
IS_AUTHENTICATED_REMEMBERED
, entonces también tiene el rolIS_AUTHENTICATED_ANONYMOUSLY
. Si tiene el rolIS_AUTHENTICATED_FULLY
, entonces también tiene los otros dos roles. En otras palabras, estos roles representan tres niveles de aumento de "fuerza" de autenticación.
Me encontré con un problema por el que los usuarios de nuestro sistema que habían utilizado la funcionalidad "Recordarme" estaban siendo tratados como si no hubieran iniciado sesión en páginas que solo ''IS_AUTHENTICATED_FULLY''
.
La respuesta entonces es exigirles que vuelvan a iniciar sesión si no están autenticados completamente, o para verificar la función recordada:
$securityContext = $this->container->get(''security.authorization_checker'');
if ($securityContext->isGranted(''IS_AUTHENTICATED_REMEMBERED'')) {
// authenticated REMEMBERED, FULLY will imply REMEMBERED (NON anonymous)
}
Con suerte, esto salvará a alguien de cometer el mismo error que cometí. Utilicé esta publicación como referencia cuando busqué cómo verificar si alguien había iniciado sesión o no en Symfony 2.