【发布时间】:2026-01-12 15:15:01
【问题描述】:
我正在关注关于创建custom user provider 的 Symfony 食谱,但我不知道如何验证用户密码。这是用户提供者的任务吗?或者这应该在其他情况下发生?如何确保他通过表单提交的密码与数据库中的密码相同?
【问题讨论】:
我正在关注关于创建custom user provider 的 Symfony 食谱,但我不知道如何验证用户密码。这是用户提供者的任务吗?或者这应该在其他情况下发生?如何确保他通过表单提交的密码与数据库中的密码相同?
【问题讨论】:
用户提供者不是处理身份验证的那个。这是身份验证提供者的任务。
请查看旁边的文章How to create a custom Authentication Provider 以获得一些想法。
您还可以查看 Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider。看看它的构造函数如何接受 userProvider 的实例,然后在retrieveUser() 中使用它从数据库中获取用户的数据?此外,在 UserAuthenticationProvider 抽象类中,即 DaoAuthenticationProvider,此数据被传递给 checkAuthentication() 方法(由 DaoAuthenticationProvider 实现)。它使用与 User 类关联的编码器首先对从 UsernamePasswordToken 检索到的 UserInterface 实例的密码进行编码,然后将其与从数据库检索到的已编码版本进行比较。
编辑:关于您的评论:不久前我做过类似的事情(只是我使用了标准表单登录和非常非标准的身份验证管理器 (:),但不幸的是我没有'不太记得实现。我记得的是我必须阅读很多 Symfony2 源代码......您可以尝试从自定义 AuthenticationProvider 的实现开始。您可以尝试基于 UserAuthenticationProvider 抽象类并使用DaoAuthenticationProvider 作为一种参考...也就是说,您可以实现retrieveUser(),使其使用您的用户提供程序来检索相关数据,然后也实现 checkAuthentication() 方法以利用检索到的用户数据的方式。然后,如果您的用户凭据以某种方式编码,我认为您需要在 secruty.encoders 配置中为您的自定义用户类指定适当的编码器。 哦,不要忘记身份验证提供程序工厂和自定义安全令牌。
非常抱歉,我提供的某些信息不正确。只是我现在还没有我的实现(坦率地说,我现在懒得再去挖掘 Symfony 2 的代码了)。
ANOTHER EDIT:关于配置部分。再一次,我不确定我是否记错了,但我认为您肯定需要在配置中指定您的自定义身份验证提供程序的工厂。然后,它将使您能够在防火墙的配置中包含密钥(您在工厂的 getKey() 方法中指定),这将启用此防火墙的自定义身份验证提供程序。
【讨论】: