2013-10-26 23 views
5

Userエンティティ用のカスタムエンティティプロバイダを作成しています。Symfony2セキュリティ - ユーザ "Ibw UserBundle Entity User"のユーザプロバイダがありません

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

私は戻って、デフォルトのDoctrineのエンティティプロバイダへの切り替え、すべてがうまくいけ:私はログインフォームでユーザー名とパスワードを入力したときにしかし、私はこの例外を取得します。ここ

まず私の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 

ここ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; 
    } 
} 

そして最後に、ここに私のIbw\UserBundle\Repository\UserRepositoryクラスがあります:

<?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

私はJobeetBundle/Resources/config/services.ymlに、またサービスとしてそれを定義しようとしました:

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

しかし残念ながら、それは私の後に正確に同じエラーを与える:

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% 

jobeet/app/config/security.ymlに私はログインフォームを投稿します。

答えて

6

ContextListenerクラス内の問題を追跡しましたが、これはタイプミスです。

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()); 
} 

変更にifこと:

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

entity: { class: Ibw\UserBundle\Entity\User }の代わりにIbwUserBundle:Userの表記を使用するか、ユーザープロバイダをサービスとして定義し、その名前を使用する必要があります。

+0

うーん、しかし何あなたのリンクと、この 'HTTPの違い:// goo.gl/DPHcJ4'を、ので、ここで

私はサービスとしてそれを追加しませんし、リポジトリとしても使用されています。 –

+0

私の不注意に申し訳ありません。私はあなたのコードを調べた後、私の答えを修正しました。 –

+0

私はサービスとして定義したり、サービスなしでそれを使ったりしてみましたが、それでも同じエラーがありました。 私のサービスで質問を編集します。 –

関連する問題