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 序列化器对对象中的嵌套结构进行非规范化