Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Error agregando Rol a Usuario

Estas en el tema de Error agregando Rol a Usuario en el foro de Symfony en Foros del Web. Hola, en el controlador de registro de usuarios busco por nombre el rol ROLE_USER y lo añado al usuario nuevo después de haber hecho un ...
  #1 (permalink)  
Antiguo 16/05/2013, 05:05
Avatar de jhg
jhg
 
Fecha de Ingreso: marzo-2012
Mensajes: 96
Antigüedad: 12 años, 7 meses
Puntos: 1
Error agregando Rol a Usuario

Hola, en el controlador de registro de usuarios busco por nombre el rol ROLE_USER y lo añado al usuario nuevo después de haber hecho un persist y un flush pero en la base de datos en la tabla que relaciona los id de usuario con los roles nunca aparece la relacion entre el nuevo usuario y su rol, el codigo del controlador es:
public function registeruserAction()
{
$em = $this->getDoctrine()
->getManager();
$user = new Username();
$form = $this->createFormBuilder($user)
->add('name', 'text')
->add('lastname', 'text')
->add('email', 'email')
->add('username', 'text')
->add('password', 'password')
->getForm();
$request = $this->getRequest();
if ($request->getMethod() == 'POST') {
$form->bind($request);

if ($form->isValid()) {
$newsalt = sha1(mt_rand());
$testuser = $em->getRepository('CompartidaCompartidaBundle:Usernam e')->findOneBySalt($newsalt);
while($testuser){
$newsalt = sha1(mt_rand());
$testuser = $em->getRepository('CompartidaCompartidaBundle:Usernam e')->findOneBySalt($newsalt);
}
$user->setSalt($newsalt);
$activateid = urlencode(base64_encode($user->getSalt()));
$factory = $this->get('security.encoder_factory');
$encoder = $factory->getEncoder($user);
$pase = $encoder->encodePassword($user->getPassword(), $user->getSalt());
$user->setPassword($pase);
$user->setIsActive(false);
$em->persist($user);
$em->flush();
// AQUI SE ASIGNA EL ROL
$rol = $em->getRepository('CompartidaCompartidaBundle:Role' )->findOneByName('ROLE_USER');
$user = $em->getRepository('CompartidaCompartidaBundle:Usernam e')->find($user->getId());
$user->addRol($rol);
$em->flush();
// Envia un correo de activacion
$message = \Swift_Message::newInstance()
->setSubject('Activar usuario de compartida.es')
->setFrom('[email protected]')
->setTo($user->getEmail())
->setBody("Active su cuenta de compartida.es en la siguiente url: http://www.compartida.es/activate/$activateid"
// $this->renderView(
// 'HelloBundle:Hello:email.txt.twig',
// array('name' => $name)
// )
);
$this->get('mailer')->send($message);
// Redirige - Esto es importante para prevenir que el usuario
// reenvíe el formulario si actualiza la página
return $this->redirect($this->generateUrl('CompartidaCompartidaBundle_homepage' ));
}
}
return $this->render('CompartidaCompartidaBundle:Admin:register user.html.twig', array(
'form' => $form->createView()
));
}
__________________
JHG
  #2 (permalink)  
Antiguo 16/05/2013, 06:18
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Error agregando Rol a Usuario

Te genera algún error ?, el problema seguramente este en las entidades postea las mismas.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 16/05/2013, 07:31
Avatar de jhg
jhg
 
Fecha de Ingreso: marzo-2012
Mensajes: 96
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Error agregando Rol a Usuario

No, ningun error, es más, si no es porque miro las tablas de la base de datos a saber loq ue hubiera tardado en darme cuenta del error. Las estidades del rol y del usuario son las siguientes:

Código:
<?php
 
namespace Compartida\CompartidaBundle\Entity;
 
use Symfony\Component\Security\Core\Role\RoleInterface;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity
 * @ORM\Table(name="roles")
 */
class Role implements RoleInterface
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(name="name", type="string", length=255)
     * @Assert\NotBlank()
     */
    protected $name;

    public function __toString()
    {
        return $this->name;
    }

    public function getRole()
    {
        return $this->name;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Role
     */
    public function setName($name)
    {
        $this->name = $name;
    
        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
}
Código:
<?php
namespace Compartida\CompartidaBundle\Entity;

use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class Username implements AdvancedUserInterface
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
 
    /**
     * @ORM\Column(name="username", type="string", length=255, unique=true)
     */
    protected $username;
 
    /**
     * @ORM\Column(name="password", type="string", length=255)
     */
    protected $password;
 
    /**
     * @ORM\Column(name="salt", type="string", length=255)
     */
    protected $salt;
 
    /**
     * @ORM\ManyToMany(targetEntity="Role")
     * @ORM\JoinTable(name="user_role",
     *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
     * )
     */
    protected $rol;

    /**
     * @ORM\Column(type="string")
     */
    protected $name;

    /**
     * @ORM\Column(type="string")
     */
    protected $lastname;

    /**
     * @ORM\Column(type="string")
     */
    protected $email;

    /**
     * @ORM\Column(name="is_active", type="boolean")
     */
    private $isActive;

    public function __toString()
    {
        return $this->username;
    }

    public function getRoles()
    {
        return $this->rol->toArray();
    }

    public function setRol($name)
    {
        $this->rol = $rol;
    
        return $this;
    }

    public function getRol()
    {
        return $this->rol;
    }

    public function getPassword()
    {
        return $this->password;
    }

    public function getSalt()
    {
        return $this->salt;
    }

    public function getUsername()
    {
        return $this->username;
    }
    
    public function eraseCredentials()
    {
        return;
    }

    public function isEqualTo(UserInterface $user)
    {
        return $this->username === $user->getUsername();
    }

    public function isAccountNonExpired()
    {
        return true;
    }

    public function isAccountNonLocked()
    {
        return true;
    }

    public function isCredentialsNonExpired()
    {
        return true;
    }

    public function isEnabled()
    {
        return $this->isActive;
    }

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->roles = new \Doctrine\Common\Collections\ArrayCollection();
    }
    
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set username
     *
     * @param string $username
     * @return Username
     */
    public function setUsername($username)
    {
        $this->username = $username;
    
        return $this;
    }

    /**
     * Set password
     *
     * @param string $password
     * @return Username
     */
    public function setPassword($password)
    {
        $this->password = $password;
    
        return $this;
    }

    /**
     * Set salt
     *
     * @param string $salt
     * @return Username
     */
    public function setSalt($salt)
    {
        $this->salt = $salt;
    
        return $this;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Username
     */
    public function setName($name)
    {
        $this->name = $name;
    
        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set lastname
     *
     * @param string $lastname
     * @return Username
     */
    public function setLastname($lastname)
    {
        $this->lastname = $lastname;
    
        return $this;
    }

    /**
     * Get lastname
     *
     * @return string 
     */
    public function getLastname()
    {
        return $this->lastname;
    }

    /**
     * Set email
     *
     * @param string $email
     * @return Username
     */
    public function setEmail($email)
    {
        $this->email = $email;
    
        return $this;
    }

    /**
     * Get email
     *
     * @return string 
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * Set isActive
     *
     * @param boolean $isActive
     * @return Username
     */
    public function setIsActive($isActive)
    {
        $this->isActive = $isActive;
    
        return $this;
    }

    /**
     * Get isActive
     *
     * @return boolean 
     */
    public function getIsActive()
    {
        return $this->isActive;
    }

    /**
     * Add roles
     *
     * @param \Compartida\CompartidaBundle\Entity\Role $roles
     * @return Username
     */
    public function addRol(\Compartida\CompartidaBundle\Entity\Role $roles)
    {
        $this->roles[] = $roles;
    
        return $this;
    }

    /**
     * Remove roles
     *
     * @param \Compartida\CompartidaBundle\Entity\Role $roles
     */
    public function removeRol(\Compartida\CompartidaBundle\Entity\Role $roles)
    {
        $this->roles->removeElement($roles);
    }
}
Al principio añadia el rol antes del persist y el flush, pense seria por el id de usuario y lo puse despues, y como seguia fallando pense en buscar el usuario despues de guardarlo y añadir el rol, pero falla todo, creo el problema este al añadir el rol pero no tengo ni idea.
__________________
JHG
  #4 (permalink)  
Antiguo 16/05/2013, 07:56
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Error agregando Rol a Usuario

La propiedad es rol o roles ?, comprueba el nombre de las propiedades.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 16/05/2013, 08:24
Avatar de jhg
jhg
 
Fecha de Ingreso: marzo-2012
Mensajes: 96
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Error agregando Rol a Usuario

La propiedad yo la llame rol y doctrine fue quien creo el addRol puse el construct con roles etc, y usando un formulario para crear un usuario seleccionando los roles en el formulario todo funciona bien, el problema es que el formulario con los roles lo uso solo en la administracion, al registrarse un usuario le quiero asignar automaticamente el rol ROLE_USER

EDITO:
Cambie en el constructor y en addRol y removeRol la variable roles por rol y ahora parece que funciona.
__________________
JHG

Última edición por jhg; 16/05/2013 a las 08:50 Razón: Solucionado

Etiquetas: rol, usuario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:13.