2014-11-28 6 views
4

Symfony2에서 로그인 및 인증에 문제가 있습니다. 예외는 "$ user는 UserInterface의 instanceof, __toString 메서드를 구현하는 객체 또는 원시 문자열이어야합니다."

내가 내 응용 프로그램에 로그인을 시도하고있는 사용자가 성공적으로 (응용 프로그램/로그/dev.log) 인증을받을 수 있다는 것을 알 수 내 코드를 디버깅하지만 자격 증명 VAR가 null :

Debugging

AbstractToken의 user 변수에는 데이터베이스의 사용자 데이터가 있습니다.

나는 ContextListener-> refreshUser 기능에 디버깅을 계속 나는 이러한 값을 얻을 :

Debugging2

모두가 null과 심포니 \ 브리지 \ 교리 \ 보안 \ 사용자 \ EntityUserProvider->에 값을 가진다을 refreshUser 함수는 $ refreshedUser 변수를 null로 반환하므로 ContextListener 클래스의 $ token-> setUser ($ refreshedUser) 함수가 실패하고 예외가 throw됩니다.

security.yml :

security: 
    encoders: 
     Pladuch\BackBundle\Entity\BaseUser: 
      algorithm: sha512 
      encode_as_base64: false 
      iterations: 1 

    providers: 
     sga: 
      entity: { class: 'PladuchBackBundle:Usuario', property: username } 

    firewalls: 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 

     sga: 
      pattern: ^/gestion 
      anonymous: ~ 
      form_login: 
       login_path: pladuch_login_sga 
       check_path: pladuch_login_check 
       default_target_path: pladuch_sga_index 
       csrf_provider: form.csrf_provider 
       provider: sga 
      logout: 
       path: pladuch_logout_sga 
       target: pladuch_login_sga 

    access_control: 
     - { path: ^/gestion/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/gestion, roles: ROLE_ADMIN } 

추상 클래스 BaseUser :

<?php 

namespace Pladuch\BackBundle\Entity; 


use Symfony\Component\Security\Core\User\AdvancedUserInterface; 

abstract class BaseUser implements AdvancedUserInterface, \Serializable 
{ 
    protected $id; 

    protected $salt; 

    protected $username; 

    protected $password; 

    public function __construct() 
    { 
     $this->isActive = true; 
     $this->salt = $this->generateSalt(); 
    } 

    public function serialize() 
    { 
     return serialize(array($this->id, $this->username, $this->password)); 
    } 

    public function unserialize($serialized) 
    { 
     list($this->id, $this->username, $this->password) = unserialize($serialized); 
    } 

    public function getRoles() 
    { 
     return array('ROLE_ADMIN'); 
    } 

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

    public function setPassword($password) 
    { 
     $this->password = $password; 
    } 

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

    public function eraseCredentials() 
    { 
    } 

    public function setSalt($salt) 
    { 
     $this->salt = $salt; 

     return $this; 
    } 

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

    public function generateSalt() 
    { 
     return base_convert(sha1(uniqid(mt_rand(), true)), 16, 36); 
    } 

    public function isAccountNonExpired() 
    { 
     return true; 
    } 

    public function isAccountNonLocked() 
    { 
     return true; 
    } 

    public function isCredentialsNonExpired() 
    { 
     return true; 
    } 

    public function isEnabled() 
    { 
     return true; 
    } 
} 

클래스 사용자 선호도 :

나는 나의 security.yml 내 실체 내가 사용하고 적어

<?php 

namespace Pladuch\BackBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Usuario 
* 
* @ORM\Table(name="usuario", 
*   uniqueConstraints={ 
*    @ORM\UniqueConstraint(name="username", columns={"username"}) 
*   }, 
*   indexes={@ORM\Index(name="FK_USUARIO_ROL", columns={"rol_id"})}) 
* @ORM\Entity(repositoryClass="Pladuch\BackBundle\Repository\UsuarioRepository") 
*/ 
class Usuario extends BaseUser 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id() 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="username", type="string", length=255, nullable=false) 
    */ 
    protected $username; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="password", type="string", length=1024, nullable=false) 
    */ 
    protected $password; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="salt", type="string", length=1024, nullable=false) 
    */ 
    protected $salt; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="email", type="string", length=255, nullable=false) 
    */ 
    protected $email; 

    /** 
    * @var Rol 
    * 
    * @ORM\ManyToOne(targetEntity="Rol", inversedBy="id") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="rol_id", referencedColumnName="id") 
    * }) 
    */ 
    protected $rol; 

    /** 
    * @var bool 
    * 
    * @ORM\Column(name="activo", type="boolean", nullable=true) 
    */ 
    protected $activo = true; 



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

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

     return $this; 
    } 

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

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

     return $this; 
    } 

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

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

     return $this; 
    } 

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

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

     return $this; 
    } 

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

    /** 
    * Set rol 
    * 
    * @param Rol $rol 
    * @return Usuario 
    */ 
    public function setRol(Rol $rol = null) 
    { 
     $this->rol = $rol; 

     return $this; 
    } 

    /** 
    * Get rol 
    * 
    * @return Rol 
    */ 
    public function getRol() 
    { 
     return $this->rol; 
    } 

    /** 
    * @return array|\Symfony\Component\Security\Core\Role\Role[] 
    */ 
    public function getRoles() 
    { 
     return array($this->getRol()->getRol()); 
    } 

    /** 
    * Set activo 
    * 
    * @param $activo 
    * @return $this 
    */ 
    public function setActivo($activo) 
    { 
     $this->activo = $activo; 

     return $this; 
    } 

    /** 
    * Get activo 
    * 
    * @return bool 
    */ 
    public function getActivo() 
    { 
     return $this->activo; 
    } 
} 

class UsuarioRepository extends EntityRepository implements UserProviderInterface 
{ 
    public function loadUserByUsername($username) 
    { 
     $q = $this->createQueryBuilder('u') 
      ->where('u.username = :username') 
      ->setParameter('username', $username) 
      ->getQuery(); 

     try { 
      $user = $q->getSingleResult(); 
     } catch (NoResultException $e) { 
      $message = sprintf('Unable to find an active Usuario object identified by %s', $username); 
      throw new UsernameNotFoundException($message, 0, $e); 
     } 

     return $user; 
    } 

    public function refreshUser(UserInterface $userInterface) 
    { 
     $class = get_class($userInterface); 

     if (! $this->supportsClass($class)) { 
      throw new UnsupportedUserException(sprintf('Instances of %s are not suppoted', $class)); 
     } 
    } 

    public function supportsClass($class) 
    { 
     return $this->getEntityName() === $class || is_subclass_of($class, $this->getEntityName()); 
    } 
} 

여러분의 도움에 감사드립니다 : 나는 세 가지 기능 loadUserByUsername, refreshUser 및 supportsClass을 구현하는 UsuarioRepository.

친절하게 제공합니다.

PS : 나는 ... 나는 내 저장소에 refreshUser 기능에 반환 문장을 추가하는 것을 잊었다,

return $this->find($userInterface->getId()); 

또는

return $userInterface; 

답변

5

확인 심포니 2.5.6를 사용하고 있습니다 $ this-> find() 메소드가 필요 없기 때문에 $ userInterface에 인증 된 사용자가 있습니다. 그게 모든 것을 해결했습니다

+0

답을 게시 해 주셔서 감사합니다. 나는 똑같은 문제를 겪었고 당신의 대답은 나를 도왔습니다. – Daniel