【问题标题】:Security in Symfony2: How a custom user provider manages to validate passwords?Symfony2 中的安全性:自定义用户提供程序如何管理验证密码?
【发布时间】:2026-01-12 15:15:01
【问题描述】:

我正在关注关于创建custom user provider 的 Symfony 食谱,但我不知道如何验证用户密码。这是用户提供者的任务吗?或者这应该在其他情况下发生?如何确保他通过表单提交的密码与数据库中的密码相同?

【问题讨论】:

    标签: php 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 的代码了)。

    ANOTHER EDIT:关于配置部分。再一次,我不确定我是否记错了,但我认为您肯定需要在配置中指定您的自定义身份验证提供程序的工厂。然后,它将使您能够在防火墙的配置中包含密钥(您在工厂的 getKey() 方法中指定),这将启用此防火墙的自定义身份验证提供程序。

    【讨论】:

    • 我做到了。但这仅适用于 WSSE。有没有更简单的,比如只有密码比较?
    • 如果您需要标准表单登录,为什么不创建自己的用户提供程序,在您的 security.providers 配置中指定它,然后为您的(理论上自定义的)用户类分配适当的编码器?我还不能完全确定,但我认为 DaoAuthenticationProvider 会从那里拿走它。
    • 我不确定我是否跟随。我刚刚按照示例创建了一个自定义用户提供程序。它不是从数据库加载,而是根据 Web 服务请求加载用户数据。现在我需要验证密码...我应该创建一个新的身份验证提供程序还是可以使用现有的?如果是这样,我该如何配置?
    • 很抱歉,这方面的文档非常缺乏。
    • 另外,要了解所有组件到底是如何粘合在一起的,您可以尝试查看 SecurityBundle 中的服务配置。据我记得,这些提供者等至少有一半的配置位于此处。
    最近更新 更多