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

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

到目前为止我做了什么:

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

    供应商:

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

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

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

提前致谢!

【问题讨论】:

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

标签: symfony entitymanager


【解决方案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() 函数。
猜你喜欢
  • 2013-09-14
  • 2018-02-27
  • 2014-06-08
  • 2020-12-22
  • 2013-04-22
  • 2018-12-10
  • 1970-01-01
  • 2021-07-26
  • 2013-02-23
相关资源
最近更新 更多