使用Web服务进行Symfony2身份验证

时间:2014-10-03 08:27:36

标签: php web-services symfony authentication

我的应用使用网络服务来检查用户名和密码是否正确。我只是通过以下简单方式从登录表单发送用户名和密码:

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

网络服务在另一台服务器上,只能从应用程序访问,并且通讯也是加密的。

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

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

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

谢谢

3 个答案:

答案 0 :(得分:3)

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

更新:

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

  

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

所以你需要创建一个扩展UserInterface的类,这个类应该具有从你的web服务返回的所有属性(默认情况下,UserInterface需要一些属性,比如username,密码,盐和角色。但是如果你不使用它们,盐和角色可以是空白的。

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

为了让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

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

我遇到了与symfony2相同的问题,并且不明白为什么这个框架像这样工作。通过提供用户名和密码来验证Web服务是很常见的,这是你在symfony2中没有开箱即用的东西。 我通过将用户名和密码作为一个由特殊分隔符(类似## || ##)分隔的连接字符串传递给loadUserByUsername() - 方法来解决这个问题。我不记得细节,但是修改调用此方法的代码部分并不困难。所以我可以通过提供用户名和密码在loadUserByUsername() - 方法中调用webservice的身份验证服务,当收回用户时,让symfony完成剩下的工作。