lunes, 9 de junio de 2014

Implementando mi Módulo de Seguridad en SF2 Parte 1

Symfony2 proporciona una forma fácil de administrar los usuarios de un sistema mediante su componente de seguridad, administrando los accesos a ciertas partes de la aplicación a través de roles. Existen varios bundles que nos ayudan en esta tarea, el más conocido el FOSUserBundle, sin embargo hay ocaciones en que no necesitamos todo lo que el bundle ofrece, pues requerimos de algo mas sencillo.
Con este bundle se manejaran los usuarios, grupos y permisos desde la base de datos usando la versión 2.3 de Symfony2, la limitante es que sólo funcionará con Doctrine.
Pueden seguir el código de este tutorial clonando el repositorio que se encuentra en github Curso Symfony2.


Requisitos para seguir este tutorial

Es necesario tener conocimientos básicos en Symfony2 para poder seguir este tutorial.
  • Controlador
  • Entidades
  • Repositorio
  • Plantillas

Definiendo las Entidades

Antes de definir las entidades es necesario crear el bundle en el que se van a almacenar las entidades con la instruccion generate:bundle, en este caso el bundle se ha nombrado XanaduSeguridadBundle.
Las entidades que tendrá el bundle son las siguientes.
  • Usuarios
  • Perfiles
  • Grupos
  • Permisos

Entidad Usuarios

La entidad Usuarios tendrá asignados los siguientes campos.
Campo Descripcion
id
nombreUsuario
password
email
perfil Relación hacia la entidad Perfiles
grupos Relación hacia la entidad Grupos
permisos Relación hacia la entidad Permisos
Código de la entidad
<?php

namespace Xanadu\SeguridadBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Usuarios
*
* @ORM\Table()
* @ORM\Entity
*/
class Usuarios
{
    /**
    * @var integer
    *
    * @ORM\Column(name="Id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

    /**
    * @var string
    *
    * @ORM\Column(name="NombreUsuario", type="string", length=30)
    */
    private $nombreUsuario;

    /**
    * @var string
    *
    * @ORM\Column(name="Password", type="string", length=255)
    */
    private $password;

    /**
    * @var string
    *
    * @ORM\Column(name="Email", type="string", length=60)
    */
    private $email;

    /**
    *
    * @ORM\OneToOne(targetEntity="Perfiles", mappedBy="usuario", cascade={"all"})
    */
    private $perfil;

    /**
    * @ORM\ManyToMany(targetEntity="Grupos")
    * @ORM\JoinTable(name="UsuariosHasGrupos",
    *     joinColumns={@ORM\JoinColumn(name="UsuarioId", referencedColumnName="Id")},
    *     inverseJoinColumns={@ORM\JoinColumn(name="GrupoId", referencedColumnName="Id")}
    * )
    */
    private $grupos;

    /**
    *
    * @ORM\ManyToMany(targetEntity="Permisos")
    * @ORM\JoinTable(name="UsuariosHasPermisos",
    *     joinColumns={@ORM\JoinColumn(name="UsuarioId", referencedColumnName="Id")},
    *     inverseJoinColumns={@ORM\JoinColumn(name="PermisoId", referencedColumnName="Id")}
    * )
    */
    private $permisos;

}

Entidad Perfiles

La entidad Perfiles tendrá asignados los siguientes campos.
Campo Descripcion
id
usuario Relación hacia la entidad Usuarios
telefonoParticular
domicilio
<?php

namespace Xanadu\SeguridadBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Perfiles
*
* @ORM\Table()
* @ORM\Entity
*/
class Perfiles
{
    /**
    * @var integer
    *
    * @ORM\Column(name="Id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

    /**
    *
    * @ORM\OneToOne(targetEntity="Usuarios", inversedBy="perfil")
    * @ORM\JoinColumn(name="UsuarioId", referencedColumnName="Id")
    */
    private $usuario;

    /**
    * @var string
    *
    * @ORM\Column(name="TelefonoParticular", type="string", length=30)
    */
    private $telefonoParticular;

    /**
    * @var string
    *
    * @ORM\Column(name="Domicilio", type="string", length=150)
    */
    private $domicilio;

}

Entidad Grupos

La entidad Grupos tendrá asignados los siguientes campos.
Campo Descripcion
id
nombre
descripcion
permisos Relación hacia la entidad Permisos
<?php

namespace Xanadu\SeguridadBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Grupos
*
* @ORM\Table()
* @ORM\Entity
*/
class Grupos
{
    /**
    * @var integer
    *
    * @ORM\Column(name="Id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

    /**
    * @var string
    *
    * @ORM\Column(name="Nombre", type="string", length=30)
    */
    private $nombre;

    /**
    * @var string
    *
    * @ORM\Column(name="Descripcion", type="string", length=30)
    */
    private $descripcion;

    /**
    * @ORM\ManyToMany(targetEntity="Permisos")
    * @ORM\JoinTable(name="GruposHasPermisos",
    *     joinColumns={@ORM\JoinColumn(name="GrupoId", referencedColumnName="Id")},
    *     inverseJoinColumns={@ORM\JoinColumn(name="PermisosId", referencedColumnName="Id")}
    * )
    */
    private $permisos;

}

Entidad Permisos

La entidad Permisos tendrá asignados los siguientes campos.
Campo Descripcion
id
nombre
descripcion
<?php

namespace Xanadu\SeguridadBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Permisos
*
* @ORM\Table()
* @ORM\Entity
*/
class Permisos
{
    /**
    * @var integer
    *
    * @ORM\Column(name="Id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

    /**
    * @var string
    *
    * @ORM\Column(name="Nombre", type="string", length=30)
    */
    private $nombre;

    /**
    * @var string
    *
    * @ORM\Column(name="Descripcion", type="string", length=255)
    */
    private $descripcion;

}
Aqui sólo se muestra la definición de los campos en las entidades, para generar los métodos para acceder a los atributos se tiene que ejecutar el comando doctrine:generate:entities XanaduSeguridadBundle NombreEntidad.
Para consultar el código visto hasta este momento en la aplicación de ejemplo, consulta el tag con la instruccion git checkout seguridad1.0.

Generar los CRUD

Una vez que se han definido las entidades el siguiente paso es generar las acciones para (C) Crear , (R) Recuperar , (U) Actualizar y (D) Eliminar registros. Para hacerlo de una forma rápida se hace uso del comando app/console doctrine:generate:crud con los siguientes parámetros dependiendo de la entidad:
Pregunta Respuesta
The Entity shortcut name XanaduSeguridadBundle:Usuarios
Do you want to generate the "write" actions yes
Configura... (yml, xml, php, or annotation) yml
Routes prefix /seguridad/usuarios
Do you confirm generation yes
Confirm automatic update of the Routing yes
Si en la última pregunta al contestar lanzara un error, sólo hay que copiar y pegar manualmente lo que indica en el archivo de enrutamiento del bundle. Repetimos lo mismo para las entidades Grupos y Permisos. Ya con esto, se puede empezar a crear los permisos y grupos que se necesiten accediendo a traves de su correspondiente URL.
http://localhost/Curso/web/app_dev.php/seguridad/permisos
Para consultar el código visto hasta este momento en la aplicación de ejemplo, consulta el tag con la instruccion git checkout seguridad1.1.

No hay comentarios.:

Publicar un comentario