Habilitar la seguridad para un Bundle en Symfony2

junio 28, 2012 at 17:24 Deja un comentario

Vamos a crear usuarios con un único rol ROLE_ADMIN y asegurarnos que sólamente autenticado pueda ver nuestros formularios, para ello seguimos los siguientes pasos:

  • Necesitamos tener instalado el JMSSecurityExtraBundle, este ya viene con la instalación estándard de Symfony2 por lo cual no se explicará aquí
  • Creamos o editamos si existe el archivo app/config/security.yml para que quede como el siguiente:
    security:
        encoders:
            Nombre\CompletoBundle\Entity\Usuario:
                #por el momento usaremos texto plano para las contraseñas
                plaintext
    
        role_hierarchy:
            ROLE_ADMIN:       [ROLE_USER]
    
        providers:
            user_db:
                entity: { class: Nombre\CompletoBundle\Entity\Usuario, property: username }
    
        firewalls:
            admin:
                pattern: /.*
                provider: user_db
                form_login:
                    login_path: /login
                    check_path: /login_check
                    remember_me: true
                    # página a la que redirigir luego de la autenticación
                    default_target_path: /mi_index
                logout:
                    path: /logout
                    target: /login
                security: true
                anonymous: true
    
        access_control:
            # La página para ingresar es necesario que se deje sin seguridad para que todos los usuarios puedan verla e ingresar sus datos
            # de no hacerlo así da un error de redirección infinita
            - { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    
  • Creamos la entidad Rol en nuestro proyecto de Symfony2, debe ser algo como lo siguiente:
    namespace Nombre\CompletoBundle\Entity;
     
    use Symfony\Component\Security\Core\Role\RoleInterface;
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * @ORM\Entity
     * @ORM\Table(name="Roles")
     */
    class Rol implements RoleInterface
    {
    
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
        /**
         * @ORM\Column(name="name", type="string", length="255")
         */
        protected $name;
    
        public function getRole() 
        {
    	return 'ROLE_ADMIN';
        }
    
    
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
    
        /**
         * Set name
         *
         * @param string $name
         */
        public function setName($name)
        {
            $this->name = $name;
        }
    
        /**
         * Get name
         *
         * @return string 
         */
        public function getName()
        {
            return $this->name;
        }
    }
    
  • Ahora creamos la entidad Usuario en nuestro proyecto de Symfony2, debe ser algo como lo siguiente:
    namespace Nombre\CompletoBundle\Entity;
     
    use Symfony\Component\Security\Core\User\UserInterface;
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * @ORM\Entity
     * @ORM\Table(name="Usuarios")
     */
    class Usuario implements UserInterface
    {
        /**
         * @ORM\ManyToMany(targetEntity="Rol")
         * @ORM\JoinTable(name="UsuarioRol",
         *     joinColumns={@ORM\JoinColumn(name="usuario_id", referencedColumnName="id")},
         *     inverseJoinColumns={@ORM\JoinColumn(name="rol_id", referencedColumnName="id")}
         * )
         */
        protected $roles;
    
         /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /**
         * @ORM\Column(type="string", length=25, unique=true)
         */
        private $username;
    
        /**
         * @ORM\Column(type="string", length=32)
         */
        private $salt;
    
        /**
         * @ORM\Column(type="string", length=250)
         */
        private $password;
    
        /**
         * @ORM\Column(type="string", length=60, unique=true)
         */
        private $email;
    
        /**
         * @ORM\Column(name="is_active", type="boolean")
         */
        private $isActive;
    
        public function __construct()
        {
            $this->isActive = true;
            $this->salt = md5(uniqid(null, true));
        }
    
        /**
         * @inheritDoc
         */
        public function getUsername()
        {
            return $this->username;
        }
    
        /**
         * @inheritDoc
         */
        public function getSalt()
        {
            return $this->salt;
        }
    
        /**
         * @inheritDoc
         */
        public function getPassword()
        {
            return $this->password;
        }
    
        /**
         * @inheritDoc
         */
        public function getRoles()
        {
            return array('ROLE_ADMIN');
    	//return $this->roles;
        }
    
        /**
         * @inheritDoc
         */
        public function eraseCredentials()
        {
        }
    
        /**
         * @inheritDoc
         */
        public function equals(UserInterface $user)
        {
            return $this->username === $user->getUsername();
        }
    
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
    
        /**
         * Set username
         *
         * @param string $username
         */
        public function setUsername($username)
        {
            $this->username = $username;
        }
    
        /**
         * Set salt
         *
         * @param string $salt
         */
        public function setSalt($salt)
        {
            $this->salt = $salt;
        }
    
        /**
         * Set password
         *
         * @param string $password
         */
        public function setPassword($password)
        {
            $this->password = $password;
        }
    
        /**
         * Set email
         *
         * @param string $email
         */
        public function setEmail($email)
        {
            $this->email = $email;
        }
    
        /**
         * Get email
         *
         * @return string 
         */
        public function getEmail()
        {
            return $this->email;
        }
    
        /**
         * Set isActive
         *
         * @param boolean $isActive
         */
        public function setIsActive($isActive)
        {
            $this->isActive = $isActive;
        }
    
        /**admin
         * Get isActive
         *
         * @return boolean 
         */
        public function getIsActive()
        {
            return $this->isActive;
        }
    
        /**
         * Add roles
         *
         * @param Nombre\CompletoBundle\Entity\Rol $roles
         */
        public function addRol(\Nombre\CompletoBundle\Entity\Rol $roles)
        {
            $this->roles[] = $roles;
        }
    }
    
  • Una vez que actualicemos nuestra base de datos para reflejar las entidades recién agregadas podemos usar instrucciones sql como las siguientes para insertar usuarios al sistema:
    INSERT INTO Roles (id, name) VALUES (1, 'ROLE_ADMIN');
    INSERT INTO Usuarios (id, username, salt, password, email, is_active) VALUES (1, 'admin', '', 'mi_pass', 'micorre@server.com', 1);
    INSERT INTO UsuarioRol (usuario_id, rol_id) VALUES (1, 1); 
    
  • Ahora agregamos un controlador llamado SecurityController que nos permitirá autenticarnos y que tiene el siguiente contenido:
    getRequest();
            $session = $request->getSession();
     
            // get the login error if there is one
            if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
                $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
            } else {
                $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
            }
     
            return $this->render('NombreCompletoBundle:Security:login.html.twig', array(
                // last username entered by the user
                'last_username' => $session->get(SecurityContext::LAST_USERNAME),
                'error'         => $error,
            ));
        }
    }
    
  • Por último a cada función que le queramos poner seguridad debemos agregarle la anotación @Secure(roles=”ROLE_ADMIN”) por ejemplo:

        ...
        use JMS\SecurityExtraBundle\Annotation\Secure;
    
      /*
       * Empresa controller.
       *
       * @Route("/empresa")
       */
      class EmpresaController extends Controller
      {
        /**
         * Función para crear Empresas.
         *
         * @Secure(roles="ROLE_ADMIN")
         */
        public function crearEmpresa($nombre) {
        ....
    

    En este caso estamos usando seguridad a nivel de función, también puede agregarse seguridad a nivel de url desde el archivo config/security.yml, por ejemplo para el caso de todas las rutas que empiezan con a palabra empresa:

    access_control:
            - { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: /empresa*, roles: ROLE_ADMIN }
    

Referencias

Listo listo.

setas
Enjoy!

Entry filed under: frameworks, php, symfony. Tags: , , .

Generar reportes en excel utilizando Symfony2 Cambiar el banner de bienvenida en SSH

Dejáte un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Trackback this post  |  Subscribe to the comments via RSS Feed


Acerca de Mi:


Hell-Out world!!

Digo yo

Es difícil hacerse la vida fácil.

Dice Victor Frankl

Lo que importa no es tanto que la vida de una persona esté llena de dolor o de placer, sino que esté llena de sentido.

Digo yo

Que dura está la vida.

Dice Jhon Lennon

La vida es lo que pasa mientras haces planes.

Digo yo

Dónde haya un computín esté dónde esté algo comenzará en cero.

Dice Einstein

Dios no juega a los dados.

Dice Niels Bohr

Einstein no le diga a Dios lo que tiene que hacer.

Dice el Che:

Seamos realistas y hagamos lo imposible.

Dice Goethe:

Lo que no comprendemos no lo poseemos.

Digo yo:

Hay que tratar de travesear todo.

Dice Oscar Wilde:

Cualquier hombre puede llegar a ser feliz con una mujer, con tal de que no la ame.

Digo yo:

De fijo dijo eso porque era homosexual.

Artículos

junio 2012
L M X J V S D
« Oct   Ago »
 123
45678910
11121314151617
18192021222324
252627282930  

A %d blogueros les gusta esto: