我正在关注关于创建自定义用户提供程序的 Symfony 食谱,但我不知道如何验证用户密码。这是用户提供者的任务吗?或者这应该在其他情况下发生?我如何确保他通过表单提交的密码等于数据库中的密码?
1 回答
用户提供者不是处理身份验证的那个。这是身份验证提供者的任务。
看看旁边的文章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 代码)。
另一个编辑:关于配置部分。再一次,我不确定我是否记得正确,但我认为您肯定需要在配置中指定您的自定义身份验证提供程序的工厂。然后,它将使您能够在防火墙的配置中包含密钥(您在工厂的 getKey() 方法中指定的),这将启用此防火墙的自定义身份验证提供程序。