Symfony2:如何使用非默认实体管理器对用户进行身份验证?

Posted

技术标签:

【中文标题】Symfony2:如何使用非默认实体管理器对用户进行身份验证?【英文标题】:Symfony2: How can I authenticate users using a non default Entity Manager? 【发布时间】:2013-06-13 16:24:56 【问题描述】:

我需要当用户登录时,他们使用第二个数据库进行身份验证,该数据库的连接不是默认数据库。我已经阅读了许多关于创建扩展 UserProviderInterface 的用户提供程序的帖子,但没有一个有效。

到目前为止我做了什么:

    我有一个自定义用户类 (MyCustomUser),它扩展了 FOSUser 类。 我在 config.yml 文件中定义了两个连接和两个实体管理器。

    我在 security.yml 中定义了我的自定义用户类的提供者:

    供应商:

      chain_provider:
          chain:
              providers: [in_memory, fos_userbundle, myusers]
      ...
    
      myusers:
          entity:  class: myproject\myBundle\Entity\MyCustomUser
    

问题是,当我尝试使用 MyCustomUser 实例的凭据(用户名/密码)登录时,Symfony 尝试根据默认连接验证此数据,其中 MyCustomUser 表不存在。换句话说,它正在尝试从默认连接加载数据,并出现“表 default_connection.MyCustomUser 不存在”之类的错误。

我应该按照哪些步骤来加载我想要的实体管理器?

提前致谢!

【问题讨论】:

我的回答是否已经足够了,还是您需要更多关于如何将非默认连接注入您的提供者的信息? 【参考方案1】:

您需要将您的非默认实体管理器注入您的自定义用户提供程序,该用户提供程序实现了UserProviderInterface。

然后在loadUserByUsername($username)方法中使用它。

【讨论】:

还是不行。我创建了一个 UserRepository 类,它扩展了 EntityRepository 并实现了 UserProviderInterface,并按照你告诉我的定义了 loadUserByUsername($username) 方法,它调用了 $this->getEntityManager('non-default-entity-manager'),以及 refreshUser(UserInterface $user) 和 supportClass($class) 方法。之后,我在 MyCustomUser 类中添加了以下注释:@ORM\Entity(repositoryClass="myproject\myBundle\Entity\UserRepository")。我现在得到的错误是“Doctrine 存储库“Doctrine\ORM\EntityRepository”必须实现 UserProviderInterface。” 我设法解决了这个问题,并且我的用户通过了非默认连接的身份验证。现在的问题是,成功登录后,Symfony 尝试更新默认数据库中名为 myCustomUser 的表中的 last_login 字段,并且由于该表不存在,它尝试执行 myCustomUser 的 INSERT INTO,但失败了。如何使用默认数据库执行用户更新?我正在使用 Symfony 2.3,失败的代码行是在文件 \vendor\friendsofsymfony\user-bundle\FOS\UserBundle\Doctrine\UserManager.php 中的 updateUser() 函数。

以上是关于Symfony2:如何使用非默认实体管理器对用户进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Symfony 2 序列化器对对象中的嵌套结构进行非规范化

如何在 Symfony2 中获取代表当前用户的实体?

Symfony 2 从实体管理器获取实体的原始数据

如何使用doctrine查询symfony2中实体类中的另一个实体

Symfony2 用户权限管理

在 Symfony2 中使用同一个包中的两个实体管理器