2014-10-03 44 views
0

我的应用程序使用web服务来检查用户名和密码是否正确。我只是给从登录表单的用户名和密码,以简单的方式是这样的:使用webservice的Symfony2身份验证

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

WebService的是另一台服务器上,它是从应用程序也将通信进行加密才能访问。

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

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

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

谢谢

回答

2

我相信你想要做的是在文档中有自己的页面。看看How to create a custom user provider,它可以很好地演示如何使用web服务来验证用户身份。

UPDATE:

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

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

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

然后您创建一个实现UserProviderInterface的用户提供程序。这将使得您在执行登录时调用功能loadUserByUsername。在这个函数中,你执行你的web服务请求,发送证书。您的请求的响应可以映射到您创建的用户类。然后你返回你创建的用户对象和从你的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 

另外,如果你的密码在你的web服务进行加密,您应该确保Symfony的加密用同样的方式做比较。所以在安全。你可以添加yml

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

这只显示如何创建用户提供者。但是我必须将密码发送到web服务,并且如果密码良好,服务将返回用户数据。所以在我打电话给webservice后,我将不得不认证用户。我如何跳过symfony步骤的其余部分? – Daniel 2014-10-08 09:40:18

+0

我更新了答案。您必须创建一个自定义用户提供者。这是唯一的方法。 – Sehael 2014-10-08 15:32:49

+0

这为用户提供编码密码,以便symfony可以检查它是否相同。但我不能这样做,因为webservice期望用户提供的用户和密码。我必须像这样将用户名和密码发送到web服务:https:// host/check?user = admin&password = 12345,如果凭证是正确的,Web服务将回复(使用用户配置文件数据)。 – Daniel 2015-01-07 14:58:06

-1

我有同样的问题与symfony2,不明白为什么这个框架是这样工作的。通过提供用户名和密码来验证web服务是非常常见的,这是你在symfony2中无法使用的东西。 我通过将用户名和密码作为一个由特殊分隔符(类似## || ##)分隔的连接字符串传递给loadUserByUsername() -method来解决此问题。我不记得详细信息,但不需要修改调用此方法的代码部分。所以我可以通过提供用户名和密码在loadUserByUsername()-方法中调用webservice的身份验证服务,并在获取用户时让symfony完成剩下的工作。