2013-10-26 14 views
5

Tworzę niestandardowego dostawcę encji dla mojej jednostki User. Ale kiedy wprowadzić nazwę użytkownika i hasło w formularzu logowania otrzymuję ten wyjątek:Bezpieczeństwo Symfony2 - Brak użytkownika użytkownika dla użytkownika "Ibw UserBundle Entity User"

There is no user provider for user "Ibw\UserBundle\Entity\User". 

Kiedy przełączyć się z powrotem do dostawcy podmiot domyślny Doctrine, wszystko idzie dobrze.

pierwsze tu jest mój security.yml:

security: 
    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

    firewalls: 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 
     secured_area: 
      pattern: ^/ 
      anonymous: ~ 
      form_login: 
       login_path: /login 
       check_path: /login_check 
       default_target_path: ibw_job_index 
      logout: 
       path: /logout 
       target:/

    access_control: 
     - { path: ^/admin, roles: ROLE_ADMIN } 

    providers: 
     default_provider: 
      entity: { class: Ibw\UserBundle\Entity\User } 

    encoders: 
     Ibw\UserBundle\Entity\User: sha512 

Oto klasa Ibw\UserBundle\Entity\User:

<?php 
namespace Ibw\UserBundle\Entity; 

use Doctrine\Bundle\DoctrineBundle\Registry; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\Security\Core\Role\Role; 
use Symfony\Component\Security\Core\User\UserInterface; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* Class User 
* @ORM\Table(name="users") 
* @ORM\Entity(repositoryClass="Ibw\UserBundle\Repository\UserRepository") 
*/ 
class User implements UserInterface, \Serializable 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string", length=25, unique=true) 
    */ 
    protected $username; 

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

    /** 
    * @ORM\Column(type="string", length=128) 
    */ 
    protected $password; 

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

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

    public function setPassword($password) 
    { 
     $encoder = $this->container->get('security.encoder_factory')->getEncoder($this); 
     $this->password = $encoder->encodePassword($password, $this->getSalt()); 
     return $this; 
    } 

    /** 
    * @return Role[] The user roles 
    */ 
    public function getRoles() 
    { 
     return array('ROLE_ADMIN'); 
    } 

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

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

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

    public function eraseCredentials() 
    { 
     // TODO: Implement eraseCredentials() method. 
    } 

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

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


    public function getId() 
    { 
     return $this->id; 
    } 

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

     return $this; 
    } 
} 

I wreszcie, oto moja Ibw\UserBundle\Repository\UserRepository klasa:

<?php 

namespace Ibw\UserBundle\Repository; 

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

class UserRepository extends EntityRepository implements UserProviderInterface 
{ 

    public function loadUserByUsername($username) 
    { 
     $q = $this->createQueryBuilder('u') 
        ->select('u') 
        ->where('u.username = :username') 
        ->setParameter('username', $username) 
        ->getQuery(); 

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


    public function refreshUser(UserInterface $user) 
    { 
     $class = get_class($user); 
     if(!$this->supportsClass($user)) 
     { 
      $message = sprintf('Unsupported class type : %s', $class); 
      throw new UnsupportedUserException($message); 
     } 

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


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

EDIT:

próbowałem zdefiniować go jako usługa Również w JobeetBundle/Resources/config/services.yml:

parameters: 
    ibw.user.provider.class: Ibw\UserBundle\Repository\UserRepository 
    ibw.user.provider.entity.class: Ibw\UserBundle\Entity\User 

services: 
    ibw.user.provider: 
     class: %ibw.user.provider.class% 
     factory_service: doctrine 
     factory_method: getRepository 
     arguments: 
      - %ibw.user.provider.entity.class% 

aw jobeet/app/config/security.yml:

providers: 
    default_provider: 
     id: ibw.user.provider 
encoders: 
    Ibw\UserBundle\Entity\User: sha512 

Ale niestety daje mi dokładnie ten sam błąd po Publikuję formularz logowania.

Odpowiedz

6

Śledziłem problem wewnątrz klasy ContextListener, okazało się, że to literówka!

Tutaj w:

public function refreshUser(UserInterface $user) 
{ 
    $class = get_class($user); 
    if (!$this->supportsClass($user)) { //This should be $class not $user 
     $message = sprintf('Unsupported class type : %s', $class); 
     throw new UnsupportedUserException($message); 
    } 

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

Zmień że if do:

if (!$this->supportsClass($class)) {} 
0

Musisz użyć oznaczenia IbwUserBundle:User zamiast nazwy użytkownika entity: { class: Ibw\UserBundle\Entity\User } w definicji dostawcy użytkownika lub po prostu zdefiniuj dostawcę użytkownika jako usługę i użyj jego nazwy.

+0

Hmmm, ale co różnica między łącza i tym 'http: // goo.gl./DPHcJ4', ponieważ mój nie dodaje go nawet jako usługi, a także jest używany jako repozytorium. –

+0

Przepraszamy za moją nieuwagę. Poprawiłem odpowiedź po sprawdzeniu kodu. –

+0

Próbowałem obu, definiując jako usługa lub używając go bez usługi, Ale nadal ma ten sam błąd. Będę edytować pytanie za pomocą mojej usługi. –