В текущей сборке Symfony 2.1 должна быть возможность использовать MongoDB в качестве Userprovider для SecurityBundle без использования FOSUserBundle (как представлено здесь: mongodb symfony user authentication? ).
Может 'Я не могу понять, где на самом деле проблема в коде, но я не могу войти с предопределенным пользователем 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
-Документ:
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
-Документ выглядит так:
Array
(
[_id] => 4f59b5731c911ab41e001234
[username] => test
[password] => test
[roles] => Array
(
[0] => ROLE_ADMIN
)
[salt] =>
[isActive] => 1
)
Но я не могу войти с именем пользователя test
и паролем test
в /admin
.