Acceder al objeto usuario después de loquear al mismo

1,935 views
Skip to first unread message

Danny alfonzo Viana perez

unread,
Mar 27, 2012, 6:14:00 PM3/27/12
to symfo...@googlegroups.com
Saludos amigos, estoy aprendiendo a usar el firewall para loguear a los usuarios en symfony 2 y les comento:

  1. Cree un SitioBundle y un UsuarioBundle
  2. Cree el Entity Usuario 
  3. Cree el fixtures para usuarios y lo cargue a la base de datos perfectamente
  4. Cree el formulario de login de usuario UsuarioType en el directorio form del UsuarioBundle
  5. Dentro del  UsuarioBundle en el DefaultController hago el loginAction() 
  6. Ahora en el SitioBundle  en el DefaultController hago el principalAction() que simplemente dirige a la plantilla principal, esta a su ves extiende al menú del sistema y este extiende a la plantilla base.
  7. mi problema es que en la plantilla del menú del sistema tengo este codigo:

{% if is_granted('ROLE_USUARIO') %}   

Conectado como <a href="{{ path('usuario_info') }}">{{ usuario.nombre }}</a> 

<a href="{{ path('usuario_logout') }}">Cerrar sesión</a>

{% else %}

<a class="topnav" href="{{ path('usuario_login') }}" >Acceder</a>

{% endif %}

El cual me da este error: 
Variable "usuario" does not exist in ::menu.html.twig at line 17

si le quito {{ usuario.nombre }} la plantilla funciona y me muestra que el usuario esta logueado

OSEA que si loguea a los usuarios pero no crea el objeto usuario con todos sus atributos en la session?

o me esta faltando algo para poder acceder a este objeto?

Agradezco su ayuda!

German Macas

unread,
Mar 27, 2012, 6:24:42 PM3/27/12
to symfo...@googlegroups.com
Que tal.

Estas enviando desde el action del controlador el objeto Usuario??


Date: Tue, 27 Mar 2012 15:14:00 -0700
From: dannyfi...@gmail.com
To: symfo...@googlegroups.com
Subject: [symfony-es] Acceder al objeto usuario después de loquear al mismo
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es

victor cruz

unread,
Mar 27, 2012, 6:47:41 PM3/27/12
to symfo...@googlegroups.com
bueno en vez de poner:

<a href="{{ path('usuario_logout') }}">Cerrar sesión</a>

para cerrar sesión debes poner:

<a href="{{ path('fos_user_security_logout') }}">Cerrar sesión</a>

Ahora para obtener los datos de un usuario logueado desde el template sería:
{{ app.user }} {# obtiene el username #}
Para otros campos del objeto usuario sería:
{{ app.user.email }}
etc

Acá te envío un resumen de cómo he utilizado yo el bundle
FosUserBundle, mira bien el adjunto

Ahora:

Para Eliminar un usuario:

1- Se busca el objeto del usuario que queremos borrar
2- Se procede a eliminarlo

En caso de que queramos borrarnos nosotros mismos:

$userSession = $this->get('security.context')->getToken()->getUser();
$this->get('fos_user.user_manager')->deleteUser($userSession);

//----------------------------------------------------------------------------

En casi de que queramos borrar a otro usuario:

$fosUser = $this->get('fos_user.user_manager')->findUserBy(array('id' => 5));
$this->get('fos_user.user_manager')->deleteUser($fosUser);

//----------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Activar o Desactivar Usuarios:
En este caso lo vamos a desactivar:

$fosUser = $this->get('fos_user.user_manager')->findUserBy(array('id' => 5));
$fosUser->setEnabled(false);
$this->get('fos_user.user_manager')->updateUser($fosUser, true);

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

para en caso de un controlador que necesite los datos de la sesion del
usuario logueado pero la misma haya expirado

Un ejemplo: En Hatteras para entrar a ver los grupos primeramente el
sistema toma el objeto fosuser de la sesión y filtra los grupos que
pertenezca al usuario que esté autenticado en ese instante, a veces
sucede que la sesión expira y cuando se trata de entrar a dicha página
nos muestra un mensaje de error en vez de redireccionarnos a la página
de autenticación, la forma d evalidar esto es en el controlador de la
siguiente manera:

$fosUser = $this->get('security.context')->getToken()->getUser();
//obtenemos el objeto fosuser autenticado
if ($fosUser != 'anon.') { //aquí en caso de haber expirado la sesión
devuelve anon.
$user = $em->getRepository('DataCimexHactivatorBundle:FosUser')->find($fosUser->getId());
} else {
return $this->redirect($this->generateUrl('homepage'));
}

Todo el controlador quedó así:

public function indexAction($page) {
$em = $this->get('doctrine')->getEntityManager();
$request = $this->getRequest();
$sesion = $request->getSession();

$fosUser = $this->get('security.context')->getToken()->getUser();
if ($fosUser != 'anon.') {
$user =
$em->getRepository('DataCimexHactivatorBundle:FosUser')->find($fosUser->getId());
} else {
return $this->redirect($this->generateUrl('homepage'));
}

$valueCantElementsPaginate = $sesion->get('valueCantElementsPaginate');

$entities =
$em->getRepository('DataCimexHactivatorBundle:HaGroup')->findAll();
$adapter = new ArrayAdapter($entities);
if ($valueCantElementsPaginate) {
$entities = new Pager($adapter, array('page' => $page,
'limit' => $valueCantElementsPaginate));
} else {
$valueCantElementsPaginate =
$em->getRepository('DataCimexHactivatorBundle:HaConfiguration')->findOneBy(array('name'
=> 'cant.show.paginate'));
$entities = new Pager($adapter, array('page' => $page,
'limit' => $valueCantElementsPaginate));
}

return $this->render('DataCimexHactivatorBundle:HaGroup:index.html.twig',
array(
'entities' => $entities,
'user' => $user
));
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Cambiar contraseña a usuario:

$this->get('fos_user.util.user_manipulator')->changePassword($username,
$password);

Ejemplo:

$this->get('fos_user.util.user_manipulator')->changePassword('caca', '1234');

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Así se crea un usuario, con tan solo una línea:

$this->get('fos_user.util.user_manipulator')->create($username,
$password, $email, $active, $superadmin);

Ejemplo:

$this->get('fos_user.util.user_manipulator')->create('victor', 'slim',
'vic...@gmail.com', true, true);

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Poner roles a usuarios:

La mejor forma es:

$fosUser = $this->get('fos_user.user_manager')->findUserBy(array('id'
=> $id)); //obtenemos el usuario al que le pondremos un nuevo rol

$fosUser->addRole('ROLE_ADMIN');
$this->get('fos_user.user_manager')->updateUser($fosUser, true);


//-------------------------------------------------------------------------------------------------

En caso de que queramos ponerle los roles desde cero a un usuario,
eliminándole los roles que ya tenía para incoporarle los nuevos:

En el caso de queramos ponerle un nuevo rol al usuario con el que
estamos logueado:

$userSession = $this->get('security.context')->getToken()->getUser();
//obtenemos nuestro propio objeto
$array[] = 'ROLE_NEW';
$userSession->setRoles($array);
$this->get('fos_user.user_manager')->updateUser($userSession, true);
//el true significa que dé automáticamente flush, de no ser así se
puede poner en false y en la siguiente línea poner "$em->flush();"

//-------------------------------------------------------------------------------------------------

En el caso de que queramos agregarle un nuevo rol a un usuario sin
quitarle los que tenía puesto:

$fosUser = $this->get('fos_user.user_manager')->findUserBy(array('id'
=> 5)); //obtenemos el usuario que queramos modificar
$rolesUser = $fosUser->getRoles(); //obtenemos los roles de dicho usuario
$rolesUser[] = 'ROLE_PROFESOR'; //le agregamos el nuevo rol
$fosUser->setRoles($rolesUser);
$this->get('fos_user.user_manager')->updateUser($fosUser, true);

//-------------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Saber si un usuario tiene un rol dado:

.../vendor/bundles/FOS/UserBundle/Util/UserManipulator.php

Verificar que el usuario "victor" tenga el rol "ROLE_SUPER_ADMIN"

//----------------------------------------------------------------------------------------------

Buscar el usuario al que verificaremos si tiene un rol dado:
$fosUser = $this->get('fos_user.user_manager')->findUserBy(array('username'
=> 'victor'));

Si se trata de verificar a nuestro propio usuario que está autenticado
en ese instante sería:
$fosUser = $this->get('security.context')->getToken()->getUser();
//aquí obtenemos directamente a victor

//----------------------------------------------------------------------------------------------

Verificar que dicho usuario tiene el rol arriba mencionado:
if ($fosUser->hasRole('ROLE_SUPER_ADMIN')) {
return true;
}

Bueno espero te sirva
Saludos Cordiales

El 27/03/12, German Macas <gero...@hotmail.com> escribió:


>
> Que tal.
>
> Estas enviando desde el action del controlador el objeto Usuario??
>


--
"Enviado desde mi iPhone"
======================
"por favor, sé breve, no me envíes un correo de más de 400 palabras"

Instalar e Integrar FosUserBundle en nuestro proyecto con Symfony2.pdf

Danny alfonzo Viana perez

unread,
Mar 27, 2012, 7:00:33 PM3/27/12
to symfo...@googlegroups.com
Cramba Victor esa si es una respuesta! jajajaja, muchas gracias, acabo de dar con el problema por mi mismo y es precisamente lo que me dices, debo acceder al objeto de la manera {{ app.user }} pero el manual que estoy siguiendo dice que es porque en la entidad Usuario definí un método mágico:
 
       public function __toString()
{
return $this->getNombre().' '.$this->getApellidos();
}

esta parte no la entiendo en realidad y me gustaría

PD: lo que no veo es exactamente donde se crea el objeto "app" o "usuario" quien lo hace? el firewall al loguear? donde puede verlo? porque el objeto se llama app? no entiendo todo esto.

victor cruz

unread,
Mar 27, 2012, 7:45:59 PM3/27/12
to symfo...@googlegroups.com
La función:

public function __toString()
{
return $this->getNombre().' '.$this->getApellidos();
}

Debes agregarla en cada clase que tengas en por ejemplo
".../src/DataCimex/HactivatorBundle/Entity"

mejor que sea así:

public function __toString() {
return sprintf('%s', $this->getName());
}

observa que $this->getName() eso depende de los atributos que tengas
en cada clase


El 27/03/12, Danny alfonzo Viana perez <dannyfi...@gmail.com> escribió:


> Cramba Victor esa si es una respuesta! jajajaja, muchas gracias, acabo de
> dar con el problema por mi mismo y es precisamente lo que me dices, debo
> acceder al objeto de la manera {{ app.user }} pero el manual que estoy
> siguiendo dice que es porque en la entidad Usuario definí un método mágico:
>
> public function __toString()
> {
> return $this->getNombre().' '.$this->getApellidos();
> }
>
> esta parte no la entiendo en realidad y me gustaría
>
> PD: lo que no veo es exactamente donde se crea el objeto "app" o "usuario"
> quien lo hace? el firewall al loguear? donde puede verlo? porque el objeto
> se llama app? no entiendo todo esto.
>
>
> On Tuesday, March 27, 2012 5:44:00 PM UTC-4:30, Danny alfonzo Viana perez
> wrote:
>>
>> Saludos amigos, estoy aprendiendo a usar el firewall para loguear a los
>> usuarios en symfony 2 y les comento:
>>
>>

>> 1. Cree un SitioBundle y un UsuarioBundle
>> 2. Cree el Entity Usuario
>> 3. Cree el fixtures para usuarios y lo cargue a la base de datos
>> perfectamente
>> 4. Cree el formulario de login de usuario UsuarioType en el directorio
>> form del UsuarioBundle
>> 5. Dentro del UsuarioBundle en el DefaultController hago el
>> loginAction()
>> 6. Ahora en el SitioBundle en el DefaultController hago el


>> principalAction() que simplemente dirige a la plantilla principal, esta
>> a
>> su ves extiende al menú del sistema y este extiende a la plantilla
>> base.

>> 7. mi problema es que en la plantilla del menú del sistema tengo este


>> codigo:
>>
>>
>> {% if is_granted('ROLE_USUARIO') %}
>>
>> Conectado como <a href="{{ path('usuario_info') }}">{{ usuario.nombre
>> }}</a>
>>
>> <a href="{{ path('usuario_logout') }}">Cerrar sesión</a>
>>
>> {% else %}
>>
>> <a class="topnav" href="{{ path('usuario_login') }}" >Acceder</a>
>>
>> {% endif %}
>>
>> El cual me da este error:
>> Variable "usuario" does not exist in ::menu.html.twig at line 17
>>
>> si le quito {{ usuario.nombre }} la plantilla funciona y me muestra que el
>>
>> usuario esta logueado
>>
>> OSEA que si loguea a los usuarios pero no crea el objeto usuario con todos
>>
>> sus atributos en la session?
>>
>> o me esta faltando algo para poder acceder a este objeto?
>>
>> Agradezco su ayuda!
>>
>>
>

Reply all
Reply to author
Forward
0 new messages