2012-03-09 5 views
2

現在インストールされているSymfony 2.1では、FOSUserBundle(ここで紹介するように:mongodb symfony user authentication?)を使用せずに、SecurityBundleのUserProviderとしてMongoDBを使用することができます。symfony 2.1でのユーザ認証にmongodbを使用

実際にコードのどこに問題があるのか​​わかりませんが、あらかじめ定義されたユーザーtest:testでログインできません。

マイsecurity.ymlは次のようになります。

 
security: 
    encoders: 
     test\TestBundle\Document\User: plaintext 
    providers: 
     document_members: 
      mongodb: { class: testTestBundle:User, property: username } 
    firewalls: 
     secured_area: 
      pattern: ^/ 
      http_basic: 
       realm: "Login to TEST" 
    access_control: 
     - { path: ^/admin, roles: ROLE_ADMIN } 
    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 

test/TestBundle/Document/User.php -Document:

 

namespace test\TestBundle\Document; 

use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Component\Security\Core\User\EquatableInterface; 
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; 

/** 
* @ODM\Document(collection="user", repositoryClass="test\TestBundle\Document\UserRepository") 
*/ 
class User implements UserInterface, EquatableInterface 
{ 

    /** 
    * @ODM\Id 
    */ 
    protected $id; 

    /** 
    * @ODM\String 
    */ 
    protected $username; 

    /** 
    * @ODM\String 
    */ 
    protected $password; 

    /** 
    * @ODM\Collection 
    */ 
    protected $roles = array(); 

    /** 
    * @ODM\String 
    */ 
    protected $salt; 

    /** 
    * @ODM\Boolean 
    */ 
    protected $isActive; 

// Setter 

    /** 
    * @param String 
    */ 
    public function setUsername($username) 
    { 
     $this->username = $username; 
    } 

    /** 
    * @param String 
    */ 
    public function setPassword($password) 
    { 
     $this->password = $password; 
    } 

    /** 
    * @param String 
    */ 
    public function setRole($role) 
    { 
     $this->roles[] = $role; 
    } 

    /** 
    * @param array 
    */ 
    public function setRoles(array $roles) 
    { 
     $this->roles = (array) $roles; 
    } 

    /** 
    * @param String 
    */ 
    public function setSalt($salt) 
    { 
     $this->salt = $salt; 
    } 

// Getter 

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

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

    /** 
    * @return array 
    */ 
    public function getRoles() 
    { 
     return $this->roles; 
    } 

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

// General 

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

    public function isEqualTo(UserInterface $user) 
    { 
     return $user->getUsername() === $this->username; 
    } 

    public function eraseCredentials() 
    { 
    } 

} 

test/TestBundle/Document/UserRepository.php

 
namespace test\TestBundle\Document; 

use Doctrine\ODM\MongoDB\DocumentRepository; 
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; 

class UserRepository extends DocumentRepository implements UserProviderInterface 
{ 
    public function loadUserByUsername($username) 
    { 
     $q = $this->createQueryBuilder() 
      ->field('username')->equals((string) $username) 
      ->getQuery(); 

     try 
     { 
      $user = $q->getSingleResult(); 
     } 
     catch (NoResultException $e) 
     { 
      throw new UsernameNotFoundException(sprintf('Can\'t find Username "%s"', $username), null, 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->loadUserByUsername($user->getUsername()); 
    } 

    public function supportsClass($class) 
    { 
     return $class === 'test\TestBundle\Document\User'; 
    } 
} 

特定route

 
Admin: 
    pattern: /admin 
    defaults: { _controller: testTestBundle:Test:index } 

事前に定義されたuser -Documentはこのようになります(既存のコントローラとビューにつながる):

 
Array 
(
    [_id] => 4f59b5731c911ab41e0
    [username] => test 
    [password] => test 
    [roles] => Array 
     (
      [0] => ROLE_ADMIN 
     ) 

    [salt] => 
    [isActive] => 1 
) 

しかし、私は、ユーザー名とパスワードtesttestで使ってログインすることはできません/admin

答えて

1

問題は、apache + fastCGI(https://github.com/symfony/symfony/pull/3551)でsymfonyを使用する際の問題に関連しています。

上記のコードは期待どおりに動作します。

+0

答えは古くなっていますが、修正されています – Gigala

関連する問題