2

I get this error 'Must implement UserProviderInterface' when trying to using the symfony login features. I'm referencing the repository * @ORM\Entity(repositoryClass="Login\LogBundle\Entity\Repository\UserRepository") . Does anyone have any ideas.

Entity

  <?php
  namespace Login\LogBundle\Entity;

  use Doctrine\Common\Collections\ArrayCollection;
  use Doctrine\ORM\Mapping as ORM;
  use Symfony\Component\Security\Core\User\UserInterface;
  use Symfony\Component\Security\Core\User\UserProviderInterface;
  /**
  * @ORM\Table(name="user")
  * @ORM\Entity(repositoryClass="Login\LogBundle\Entity\Repository\UserRepository")
  * @ORM\HasLifecycleCallbacks()
  */
 class User implements UserInterface, \Serializable
 {
/**
 * @var integer
 */
private $id;

/**
 * @var string
 */
private $password;

/**
 * @var string
 */
private $name;

/**
 * @var string
 */
private $username;

  /**
 * @ORM\Column(type="string", length=32)
 */
private $salt;

 /**
 * @ORM\Column(type="string", length=60, unique=true)
 */
private $email;

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

 /**
  /**
 * @OneToMany(targetEntity="userapidetails", mappedBy="user")
 */
public $userapidetails;

 public function __construct()
{
    $this->userapidetails = new ArrayCollection();
    $this->isActive = true;
    $this->salt = md5(uniqid(null, true));
}

public function getUserapidetails() {
   return $this->userapidetails;
}

// public function setUserapidetails($userapidetails) {
//    $this->userapi=$userapidetails;

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

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

    return $this;
}

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

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

    return $this;
}

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

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

    return $this;
}

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


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

    return $this;
}

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

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

    return $this;
}

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

/**
 * Set isactive
 *
 * @param string $isactive
 * @return User
 */
public function setIsactive($isactive)
{
    $this->isactive = $isactive;

    return $this;
}

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




 /**
 * @inheritDoc
 */
public function getRoles()
{
    return array('ROLE_USER');
}

/**
 * @inheritDoc
 */
public function eraseCredentials()
{
}

/**
 * @see \Serializable::serialize()
 */
public function serialize()
{
    return serialize(array(
        $this->id,
        $this->username,
        $this->salt,
        $this->password,
    ));
}

/**
 * @see \Serializable::unserialize()
 */
public function unserialize($serialized)
{
    list (
        $this->id,
        $this->username,
        $this->salt,
        $this->password,
    ) = unserialize($serialized);
  }







  }

Repository

      // src/Acme/UserBundle/Entity/UserRepository.php
    namespace Login\LogBundle\Entity;

   use Doctrine\ORM\EntityRepository;
   use Symfony\Component\Security\Core\User\UserInterface;
   use Symfony\Component\Security\Core\User\UserProviderInterface;
   use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
   use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
   use Doctrine\ORM\NoResultException;

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

    try {
        // The Query::getSingleResult() method throws an exception
        // if there is no record matching the criteria.
        $user = $q->getSingleResult();
    } catch (NoResultException $e) {
        $message = sprintf(
 'Unable to find an active admin AcmeUserBundle:User object identified    by    "%s".',
            $username
        );
        throw new UsernameNotFoundException($message, 0, $e);
    }

    return $user;
}

public function refreshUser(UserInterface $user)
{
    $class = get_class($user);
    if (!$this->supportsClass($class)) {
        throw new UnsupportedUserException(
            sprintf(
                'Instances of "%s" are not supported.',
                $class
            )
        );
    }

    return $this->find($user->getId());
}

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

2 Answers 2

4

Check the app/config/security.yml file with something like this:

# app/config/security.yml
security:
    providers:
        main:
            entity:
                class: Acme\UserBundle\Entity\User
                property: username

And path to repositoryClass UserRepository is wrong, maybe you mean this:

@ORM\Entity(repositoryClass="Login\LogBundle\Entity\UserRepository")

becouse you use namespace \Login\LogBundle\Entity\UserRepository.

Sign up to request clarification or add additional context in comments.

3 Comments

Fix the UserRepository namespace in @ORM\Entity(repositoryClass="Login\LogBundle\Entity\Repository\UserRepository") to @ORM\Entity(repositoryClass="Login\LogBundle\Entity\UserRepository")
Is this fix your problem?
yes thanks, this is how they recommend providers: main: entity: { class: LoginLogBundle:User ,property: username}
2

To load user from Repository, you should omit the { property: username } from security.yml.

1 Comment

it is necessary in symfony >2.3 but not in symfony <2.2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.