2012-03-09 12 views
3

私は実際に自分のデータベースと一致するログインフォームを作成しようとしています。Symfony2ユーザープロバイダはログイン時にUserInterfaceオブジェクトを返さなければなりません

フォームは正常に機能しますが、私はUserRepositoryを使用して問題が発生しています。 symfonyは私に次のエラー与える:

The user provider must return a UserInterface object. 
exception 'Symfony\Component\Security\Core\Exception\AuthenticationServiceException' with message 'The user provider must return a UserInterface object.' in C:\wamp\www\php\Promocast\Symfony\vendor\symfony\src\Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider.php:101 

をしかし、あなたは以下を参照することができますように、私のユーザエンティティはので、私は本当に間違いがここに何を理解していないUserInterfaceによって実装されます。

マイユーザエンティティ:

<?php 

    namespace Promocast\UtilisateurBundle\Entity; 

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

    /** 
    * Promocast\UtilisateurBundle\Entity\ImUser 
    * 
    * @ORM\Entity(repositoryClass="Promocast\UtilisateurBundle\Entity\ImUserRepository") 
    */ 
    class ImUser implements UserInterface 
    { 

     /** 
     * Here all my var and getter/setter 
     * ... 
     */ 

     /** 
     * Fonctions UserInterface 
     * 
     */ 
     public function eraseCredentials() 
     { 
     } 
     public function getRoles() 
     { 
      return $this->idrole; 
     } 
     public function equals(UserInterface $user) 
     { 
      return $user->getUsername() === $this->login; 
     } 
     public function getUsername() 
     { 
      return $this->login; 
     } 
     public function getSalt() 
     { 
      return ''; 
     } 

    } 

私のユーザーリポジトリ:

<?php 

    namespace Promocast\UtilisateurBundle\Entity; 

    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\EntityRepository; 
    use Doctrine\ORM\NoResultException; 

    class ImUserRepository extends EntityRepository implements UserProviderInterface 
    { 
     public function loadUserByUsername($login) 
     { 
      $user = $this->findBy(array("login" => $login)); 

      if (!$user) { 
       throw new UsernameNotFoundException(sprintf('No user with name "%s" was found.', $login)); 
      } 

      return $user; 
     } 

     public function refreshUser(UserInterface $user) 
     { 
      return $this->loadUserByUsername($user->getUsername()); 
     } 

     public function supportsClass($class) 
     { 
      return $class === 'Promocast\UtilisateurBundle\Entity\ImUser'; 
     } 
    } 

そして、私のsecurity.yml:

security: 
     encoders: 
      Promocast\UtilisateurBundle\Entity\ImUser: plaintext 
      #Promocast\UtilisateurBundle\Security\Provider\LoginWebService: plaintext 

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

     providers: 
      main: 
       entity: { class: PromocastUtilisateurBundle:ImUser } 
       #entity: { class: Promocast\UtilisateurBundle\Entity\ImUser, property: login } 
       #id: webservice_user_provider 


     firewalls: 
      dev: 
       pattern: ^/(_(profiler|wdt)|css|images|js)/ 
       security: false 
      login: 
       pattern: ^/(login$|register|resetting) 
       anonymous: true       
      main: 
       pattern: ^/      
       form_login:      
        login_path: /login    
        check_path: /login_check    
        username_parameter: _login 
        password_parameter: _password 
       remember_me: 
        key:   %secret%  
       anonymous:  true   
       provider:  main 
       logout:   true    
       logout: 
        path: /logout 
        target:/

     access_control: 
      #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
      #- { path: ^/_internal, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 } 
      #- { path: /.*, role: ROLE_USER } 
      #- { path: /login, role: IS_AUTHENTICATED_ANONYMOUSLY } 

どうもありがとう!

答えて

3

あなたの問題はここにあるように見えます:あなたが意図したとおりに

public function loadUserByUsername($login) 
{ 
    $user = $this->findBy(array("login" => $login)); 
    if (!$user) { 
     throw new UsernameNotFoundException(sprintf('No user with name "%s" was found.', $login)); 
    } 

    return $user; 
} 

$this->findBy()は、おそらく(結果セットが1行だけ含まれている場合でも)、カーソル/結果セットではなく、1行を返しています。

代わりに$this->findOneBy()を試してみてください。

コードに基づいて、How to load Security Users from the Database (the Entity Provider)の料理教室のチュートリアルに従っているようですが、そうでない場合は、このケースでは参考になるリソースです。

+0

ありがとう、あなたは私の問題を解決しました! 私は料理本に従っていますが、私はdqlリクエストでエンティティリポジトリが正常に動作するので、findbyがこの種の使用にはうまくいかないと思いました! もう一度お世話になりました! – Snroki

0

注意:私はS2セキュリティシステムの専門家からは遠いです。私はちょうど私のために働くものを掲示しています。

ImUserRepositoryをユーザープロバイダとして使用するようにシステムに指示する設定ファイルはありません。したがって、システムは基本的にデフォルトプロバイダを使用しようとしています。さらに、リポジトリを使用することは、せいぜい問題があります。 Doctrine reposはDoctrineのエンティティマネージャからしか来ることができませんので、私のユーザクラスが教義のエンティティであると言ってもらうようにシステムに依頼しています。したがって、リポジトリを使用する必要があります。起こることはありません。

ユーザープロバイダにサービスを作成し、エンティティマネージャを挿入します。

security: 
    providers: 
     my_provider: 
      id: zayso_core.user.provider 


    <service id="zayso_core.user.provider" class="Zayso\CoreBundle\Component\User\UserProvider" public="true"> 
     <argument type="service" id="doctrine.orm.accounts_entity_manager" /> 
     <argument type="string">%zayso_core.user.class%</argument> 
    </service> 

あなたは、おそらくまた、最終的にはそう、あなたのパスワードをエンコードすることになるでしょう:

security: 
    encoders: 
     Zayso\AreaBundle\Component\User\User: 
      id: zayso_core.user.encoder 


    <service id="zayso_core.user.encoder" class="Zayso\CoreBundle\Component\User\Encoder" public="true"> 
    </service> 

そして、それはあなたが軌道に乗る必要があります。

+0

はその可能性が、事は、私は私のユーザエンティティに私のリポジトリを呼び出すです: * @ORM \エンティティ(repositoryClass =「Promocast \ UtilisateurBundle \エンティティ\ ImUserRepository」)が、あなたの答えをありがとう! – Snroki

関連する問題