【问题标题】:Symfony2 authentication using a webserviceSymfony2 使用 Web 服务进行身份验证
【发布时间】:2017-05-26 04:42:09
【问题描述】:

我的应用程序使用网络服务来检查用户名和密码是否正确。我只是以一种简单的方式从登录表单中发送用户名和密码,如下所示:

https://host/check?user=admin&password=12345"

网络服务位于另一台服务器上,只能从应用程序访问,而且通信已加密。

身份验证后,网络服务会返回我需要的有关用户的所有信息(姓名、电子邮件等),因此我不会在数据库中保留任何内容。

在 symfony 1 中这很容易做到,但我看到 symfony 2 安全组件喜欢把事情复杂化很多。

在 symfony 2 中实现这种身份验证的最佳方法是什么?

谢谢

【问题讨论】:

    标签: php web-services symfony authentication


    【解决方案1】:

    我相信您想要做的事情在文档中有它自己的页面。看看How to create a custom user provider,它很好地介绍了如何使用 Web 服务对用户进行身份验证。

    更新:

    是的,我分享的链接告诉您如何创建用户提供程序。这正是你必须做的。在本页的第一段中,它说:

    当用户提交用户名和密码时,身份验证层要求配置的用户提供程序返回给定用户名的用户对象。

    因此您需要创建一个扩展UserInterface 的类,并且该类应该具有从您的Web 服务返回的所有属性(同样默认情况下,UserInterface 需要一些属性,例如用户名、密码、 salt 和 roles。但是如果你不使用 salt 和 roles 可以是空白的)。

    然后您创建一个实现UserProviderInterface 的用户提供程序。这将使函数loadUserByUsername 在您执行登录时被调用。在此函数中,您执行 Web 服务请求,发送凭据。然后可以将您的请求响应映射到您创建的用户类。然后返回您使用从您的网络服务返回的数据创建的用户对象。

    为了让 Symfony 知道你想使用你的自定义用户提供者来登录你的表单,你需要为你的用户提供者创建一个服务。因此,在src/Acme/WebserviceUserBundle/Resources/config/services.yml(您可能需要创建文件)中,您可以添加文档中概述的服务:

    parameters:
        # path to the user provider you just created
        webservice_user_provider.class: Acme\WebserviceUserBundle\Security\User\WebserviceUserProvider
    
    services:
        webservice_user_provider:
            class: "%webservice_user_provider.class%"
    

    创建此服务后,您只需告诉表单登录以使用此自定义提供程序。在 security.yml 中:

    security:
        providers:
            webservice:
                # this id is the name of the service you created
                id: webservice_user_provider
    

    另外,如果您的密码在您的网络服务中被加密,您应该确保 Symfony 以相同的方式对其进行加密以进行比较。所以在security.yml中你可以添加

    security:
        encoders:
            Acme\WebserviceUserBundle\Security\User\WebserviceUser: sha512 # or md5, or others
    

    【讨论】:

    • 这里只展示了如何创建一个用户提供者。但是我必须将密码发送给网络服务,如果密码正确,服务将返回用户数据。所以在我调用网络服务之后,我必须对用户进行身份验证。我如何跳过其余的 symfony 步骤?
    • 我更新了答案。您必须创建自定义用户提供程序。这是唯一的方法。
    • 这为用户提供了编码密码​​,以便 symfony 可以检查它是否相同。但我不能这样做,因为网络服务需要用户提供的用户和密码。我必须像这样将用户名和密码发送到网络服务:host/check?user=admin&password=12345,如果凭据正确与否,网络服务将回复(使用用户配置文件数据)。
    • 看看this answer。你想做的不是 symfony 内置的,因为它改变了 Symfony 处理安全性的方式。因此,您将需要一个自定义身份验证提供程序以及一个自定义用户提供程序。另请参阅 the docs 关于创建自定义身份验证提供程序。
    【解决方案2】:

    事实上,您需要一个Authentication Provider 并使用WSSE 安全性。

    网上有很多教程解释了如何为 Symfony 设置 WSSE。

    【讨论】:

      【解决方案3】:

      我在 symfony2 上遇到了同样的问题,不明白为什么这个框架会这样工作。通过提供用户名和密码来对 web 服务进行身份验证是很常见的,而这在 symfony2 中是无法开箱即用的。 我通过将用户名和密码作为一个由特殊分隔符(类似于##||##)分隔的串联字符串传递给loadUserByUsername()-方法来解决该问题。我不记得细节,但修改调用此方法的代码部分并不难。所以我可以通过提供用户名和密码在loadUserByUsername()-method 中调用webservice 的身份验证服务,然后在找回用户时让symfony 完成剩下的工作。

      【讨论】:

        猜你喜欢
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 2014-06-08
        • 2018-06-17
        • 1970-01-01
        • 2012-02-10
        相关资源
        最近更新 更多