使用第三个参数自定义登录


Custom Login using a Third Parameter

我正在为Symfony2开发一个相对简单的登录系统。

我已经掌握了基本知识,工作也很好。

这有点特别的是,我需要一种方式来提供第三个价值(生态系统价值)。我的数据库中的用户名本身并不是唯一的,而是具有生态系统价值的唯一配对。

生态系统的价值是由他们登录的表单提供的。

在执行登录时,我如何使用这个生态系统价值?

看看Cookbook教程中关于如何从数据库(实体提供程序)加载安全用户的内容,特别是关于使用自定义实体提供程序对某人进行身份验证的部分。

本部分介绍如何更改/创建UserProviderInterface以允许通过电子邮件地址或用户名登录。显然,这不是您想要的,但修改代码以查询/验证第三个登录参数应该相对简单。

理想情况下,您可能想要创建自己的UserProvider,幸运的是,有一本食谱教程正是针对这一点:如何创建自定义用户提供程序。


更新:要处理第三个登录选项并将其传递给您的自定义提供程序(如上创建),您还需要创建一个自定义身份验证提供程序。看看(另一篇)关于如何创建自定义身份验证提供程序的食谱文章。本文是为处理用于身份验证的额外请求标头参数而定制的,但使用此示例,您应该能够将请求标头换成请求POST值。

使用烹饪书文章来了解Symfony2的身份验证是如何工作的,但要使用(并扩展)Symfoy2的用户名/密码功能,只需包含您的第三个参数。要查看的一些类:

  • 用户名密码FormAuthenticationListener
  • 用户名密码令牌
  • UserAuthenticationProvider

您可以创建自定义密码验证器(>=Symfony 2.6)并在其中设置属性:

  1. createToken():创建令牌(可以使用UsernamePasswordToken)并为其设置属性,从$request中获取所需的数据
  2. authenticateToken():在这里,您可以使用第三个变量($token->getAttribute())执行一些操作。如果它影响loadUserByUsername,请阅读下面的内容

在authenticateToken()中,您有UserProvider和loadUserByUsername。我所做的是使用我的用户提供程序(它扩展了FOSUserBundle并覆盖了所述方法),并向它传递一个包含用户名和其他所需数据的数组。不要忘记检查loadUserByUsername内部传递的内容(例如,如果是字符串,则调用parent::loadUserByUsername)。

我确信loadUserByUsername的这个技巧很糟糕,但我不知道还能怎么做。