在 symfony 2.1 中使用 mongodb 进行用户认证
Posted
技术标签:
【中文标题】在 symfony 2.1 中使用 mongodb 进行用户认证【英文标题】:Using mongodb for user authentication in symfony 2.1
【发布时间】:2012-03-26 17:05:18
【问题描述】:
在 Symfony 2.1 的当前版本中,应该可以将 MongoDB 用作 SecurityBundle 的 Userprovider,而无需使用 FOSUserBundle(此处介绍:mongodb symfony user authentication?)。
想不通,代码的问题到底出在哪里,但我无法使用预定义用户test:test
登录。
我的security.yml
看起来像这样:
安全:
编码器:
test\TestBundle\Document\User:纯文本
提供者:
文档成员:
mongodb:类:testTestBundle:用户,属性:用户名
防火墙:
安全区域:
模式:^/
http_basic:
领域:“登录测试”
访问控制:
- 路径:^/admin,角色:ROLE_ADMIN
角色层次结构:
ROLE_ADMIN:ROLE_USER
test/TestBundle/Document/User.php
-文档:
命名空间测试\TestBundle\Document;
使用 Symfony\Component\Security\Core\User\UserInterface;
使用 Symfony\Component\Security\Core\User\EquatableInterface;
使用 Doctrine\ODM\MongoDB\Mapping\Annotations 作为 ODM;
/**
* @ODM\Document(collection="user", repositoryClass="test\TestBundle\Document\UserRepository")
*/
类 User 实现 UserInterface、EquatableInterface
/**
* @ODM\ID
*/
受保护的$id;
/**
* @ODM\字符串
*/
受保护的$用户名;
/**
* @ODM\字符串
*/
受保护的$密码;
/**
* @ODM\集合
*/
受保护的 $roles = array();
/**
* @ODM\字符串
*/
受保护的$盐;
/**
* @ODM\布尔值
*/
受保护的$isActive;
// 设置器
/**
* @param 字符串
*/
公共函数 setUsername($username)
$this->用户名 = $用户名;
/**
* @param 字符串
*/
公共函数 setPassword($password)
$this->密码 = $密码;
/**
* @param 字符串
*/
公共函数 setRole($role)
$this->角色[] = $角色;
/**
* @param 数组
*/
公共函数 setRoles(数组 $roles)
$this->roles = (array) $roles;
/**
* @param 字符串
*/
公共函数 setSalt($salt)
$this->salt = $salt;
// 吸气剂
/**
* @return 字符串
*/
公共函数获取用户名()
返回 $this-> 用户名;
/**
* @return 字符串
*/
公共函数 getPassword()
返回 $this->密码;
/**
* @return 数组
*/
公共函数 getRoles()
返回 $this-> 角色;
/**
* @return 字符串
*/
公共函数 getSalt()
返回 $this->salt;
// 一般的
公共函数 __construct()
$this->isActive = true;
$this->salt = '';
公共函数 isEqualTo(UserInterface $user)
返回 $user->getUsername() === $this->username;
公共功能擦除凭据()
test/TestBundle/Document/UserRepository.php
:
命名空间测试\TestBundle\Document;
使用 Doctrine\ODM\MongoDB\DocumentRepository;
使用 Symfony\Component\Security\Core\User\UserInterface;
使用 Symfony\Component\Security\Core\User\UserProviderInterface;
使用 Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
使用 Symfony\Component\Security\Core\Exception\UnsupportedUserException;
类 UserRepository 扩展 DocumentRepository 实现 UserProviderInterface
公共函数 loadUserByUsername($username)
$q = $this->createQueryBuilder()
->field('username')->equals((string) $username)
->getQuery();
尝试
$user = $q->getSingleResult();
捕获(NoResultException $e)
throw new UsernameNotFoundException(sprintf('Can\'t find Username "%s"', $username), null, 0, $e);
返回$用户;
公共功能刷新用户(用户界面$用户)
$class= get_class($user);
if (!$this->supportsClass($class))
throw new UnsupportedUserException(sprintf('不支持“%s”的实例。', $class));
返回 $this->loadUserByUsername($user->getUsername());
公共函数 supportClass($class)
返回 $class=== 'test\TestBundle\Document\User';
具体route
:
行政:
模式:/管理员
默认值: _controller: testTestBundle:Test:index
(将导致现有的控制器和视图)
预定义的user
-Document 如下所示:
大批
(
[_id] => 4f59b5731c911ab41e001234
[用户名] => 测试
[密码] => 测试
[角色] => 数组
(
[0] => ROLE_ADMIN
)
[盐] =>
[活跃] => 1
)
但我无法在/admin
使用用户名test
和密码test
登录。
【问题讨论】:
【参考方案1】:
问题与在 apache + fastCGI 上使用 symfony 的问题有关 (https://github.com/symfony/symfony/pull/3551)。
以上代码按预期工作。
【讨论】:
答案已过时,已修复以上是关于在 symfony 2.1 中使用 mongodb 进行用户认证的主要内容,如果未能解决你的问题,请参考以下文章
需要使用 MongoDB.so 扩展的 Symfony 2 MongoDB 包
Symfony 的独立 PHP 项目使用哪个 MongoDB 库?
Symfony 的独立 PHP 项目使用哪个 MongoDB 库?
配置 Symfony 5.3 以使用专用的 MongoDB 数据库进行测试
如何在 Symfony 中为使用 queryBuilder 构建的 MongoDB 查询编写单元测试
Symfony(PHP 框架)和 MongoDB(或任何基于 json 的数据库)[关闭]