entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Hola, tengo el siguiente inconveniente con FOSUserBundle en Symfony 2.7
Mi aplicacion tiene las siguientes tablas:

  1. Persona: Aqui se guarda la información personal, ID, NOMBRES, GENERO ETC..
  2. User: Aqui se le asigna a la persona el acceso a la aplicación, USERNAME, PASSWORD
  3. Group: Información sobre el grupo y los roles que este tiene.
  4. UserGroup: Donde se guarda la Persona su grupo y/o Sus datos de acceso (User)

Lo que deseo hacer es: Una persona puede tener un Rol pero no Acceso, puede ser un Estudiante pero no se le crean los datos de acceso a la aplicación, por eso he intentado lo siguiente:

enter image description here

El Problema: cuando me logeo el sistema no me toma los roles del grupo, unicamente el que le asigno al usuario
lo que realizado es, Crear una Entity llamada UserGroup, para poder añadir el campo adicional que nesecito persona_id.

enter image description here

Estas son mis entidades:

Persona:
Persona Entity

class Persona
{
     /**
     * GRUPOS
     * @ORM\OneToMany(targetEntity="SeguridadBundle\Entity\Usergroup", mappedBy="persona", cascade={"persist", "remove"})
     */
    private $grupos;
}

User:
User Entity

/**
 * User
 *
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
/**
     * GRUPOS
     * @ORM\OneToMany(targetEntity="SeguridadBundle\Entity\UserGroup", mappedBy="cuenta", cascade={"persist", "remove"})
     */
    private $grupos;
}

Group
Group Entity

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_group")
 */
class Group extends BaseGroup
{
    /**
     * GRUPOS
     * @ORM\OneToMany(targetEntity="SeguridadBundle\Entity\UserGroup", mappedBy="grupo", cascade={"persist", "remove"})
     */
    private $grupos;
}

UserGroup
UserGroup Entity

/**
 * User
 *
 * @ORM\Entity
 * @ORM\Table(name="usuario_grupo")
 */
class UserGroup
{
/**
     * @ORM\ManyToOne(targetEntity="PrestamoBundle\Entity\Persona", inversedBy="grupos")
     * @ORM\JoinColumn(name="persona_id", referencedColumnName="id")
     */
    private $persona;

    /**
     * @ORM\ManyToOne(targetEntity="SeguridadBundle\Entity\User", inversedBy="grupos")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $cuenta;

    /**
     * @ORM\ManyToOne(targetEntity="SeguridadBundle\Entity\Group", inversedBy="grupos")
     * @ORM\JoinColumn(name="group_id", referencedColumnName="id")
     */
    private $grupo;
}

Llevo unos días intentando solucionarlo y no me ha sido posible, Agradezco si me pueden ayudar u orientar en este tema!

1 Respuesta

2votos

magarzon Puntos30650

Hola.

Creo que el lío lo tienes en cómo has diseñado el modelo de datos.

Para empezar, si Persona contiene los datos personales de un usuario, debería estar directamente relacionado con la entidad User, y no esa cosa rara que haces de utilizar la entidad UserGroup para relacionar tres entidades (User, Group y Persona).

Esta entidad "intermedia" que has utilizado (UserGroup), además hace que no funcione el mecanismo de herencia de roles de un grupo al usuario, pues al final no hay relación directa entre la entidad User y la entidad Group.

Lo que debes hacer es eliminar esa entidad UserGroup y redefinir el resto de la siguiente manera:

class Persona
{
     /**
     * @ORM\OneToOne(targetEntity="SeguridadBundle\Entity\User", mappedBy="persona", cascade={"persist", "remove"})
     */
    private $user;
}
/**
 * User
 *
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
    * @ORM\OneToOne(targetEntity="SeguridadBundle\Entity\Persona", inversedBy="user")
    **/
    private $persona;

    /**
     * GRUPOS
     * @ORM\ManyToMany(targetEntity="SeguridadBundle\Entity\Group")
     */
    private $grupos;
}
/**
 * @ORM\Entity
 * @ORM\Table(name="fos_group")
 */
class Group extends BaseGroup
{
   //Eliminamos la referencia a UserGroup
}

Al definir la relación entre User y Group como ManyToMany, te va a crear una tabla intermedia (creo que lo que pretendías hacer "a mano" con UserGroup). Por defecto la genera con un nombre derivado de las dos tablas/entidades relacionadas, pero puedes cambiarlo utilizando la anotación JoinTable.

Además, si no lo has hecho ya, debes incluir en la configuración de FOSUserbundle cuál es tu entidad "grupo", para que funcione la herencia de roles:

# app/config/config.yml
fos_user:
    db_driver: orm
    firewall_name: main
    user_class: SeguridadBundle\Entity\User
    group:
        group_class: SeguridadBundle\Entity\Group

Espero que con esto te quede un poco más claro todo, si no, ya sabes, pregunta.

Saludos.

2votos

yuliandavid comentado

Gracias por su respuesta, así lo tenía y funciona correctamente, Lo que estoy haciendo es un sistema de préstamos para los estudiantes de mi institución, entonces abrá un admin que asigne los elementos prestados al respectivo estudiante, es por eso que cree la tabla intermedia UserGroup.

Al implementarlo como usted menciona, si le quiero asignar un rol a la persona obligatoriamente debo crear un acceso en fos_user

  • Una persona pueda tener un rol, pero no acceso.me explico, en mi aplicación solo las personas que tengan el rol Administrador tienen acceso entonces solo ellos irían tanto a la tabla persona como a fos_user, en cuanto al resto de roles solo irían a la tabla persona, por que necesito de ellos sus datos personales mas no darles acceso.

O estoy equivocado y este tipo de usuarios debería manejarlos en otra tabla?

le agradezco su ayuda.

1voto

magarzon comentado

Pero una Persona puede hacer login (aunque luego no le des acceso)? En ese caso, siempre tienes que tener un user para esa persona, para no complicar demasiado la historia, y luego darle o no acceso utilizando las configuraciones de seguridad.

1voto

yuliandavid comentado

pues solo quiero darle user únicamente a ciertas personas (administradores) a los demás no es necesario, podría hacerlo y des habilitar la cuenta pero creo que no es así.

2votos

magarzon comentado

Si lo que quieres es usar Persona como un simple registro de datos que alguien actualiza mediante un sistema de backoffice/administración, y luego a algunas de esas personas darle un usuario, te sirve el modelo que te he puesto. En lugar de complicarte con roles y grupos, sólo aquellas personas que tienen un user asociado tienen acceso.

Actualizo mi comentario: Si lo que quieres es asignar grupos también a Persona y que esa relación se mantenga, tienes dos opciones, una añadir la relación ManyToMany con Group también a Persona, y cuando crees un usuario, copiar esa relación ($user->setGroups($persona->getGroups()). Pero esto te crea una tabla adicional para la relación Persona-Group.

Una solución mejor es mover la relación ManyToMany de User a Persona, y en User redefinir el método getGroups para que obtenga los del objeto Persona asociado (suponiendo que un user siempre va a tener un objeto Persona asociado, si no, habría que hacerlo de la primera manera).

De este modo, quedaría así:

class Persona
{
     /**
     * @ORM\OneToOne(targetEntity="SeguridadBundle\Entity\User", mappedBy="persona", cascade={"persist", "remove"})
     */
    private $user;

    /**
     * GRUPOS
     * @ORM\ManyToMany(targetEntity="SeguridadBundle\Entity\Group")
     */
    private $grupos;
}
/**
 * User
 *
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
    * @ORM\OneToOne(targetEntity="SeguridadBundle\Entity\Persona", inversedBy="user")
    **/
    private $persona;

    public function getGroups()
    {
        return $this->persona->getGroups();
    }
}

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta