自定义身份验证,不需要UserProvider

时间:2013-02-20 19:19:26

标签: security authentication symfony symfony-2.1

我在网上为我的配置寻找解决方案,但我找不到满足我需求的东西。 到目前为止,我已经整整工作了3天,我无法使其正常工作,我确信有几件事我不理解。

我正在2.1分支上开发我的symfony应用程序。

简而言之。我有一个Web服务,我想用它进行身份验证。

这是我想要实现的流程:

  1. 用户提交凭据
  2. 这些凭据(需要用户名和密码)将发送到我的网络服务
  3. 如果用户名/密码正确,则webservice会为数组提供用户名,角色和其他一些内容,但密码。 (如果凭据不正确,将返回包含一个字段的数组)
  4. 只要webservice提供“大”数组,我就希望用户被认为是经过身份验证的。
  5. 根据返回的角色,我希望Symfony安全组件为用户提供相应的授权。
  6. 我想避免为浏览的每个页面调用webservice。
  7. 我不知道是否可以使用Symfony进行此操作,因为这个工作流程似乎不是更安全,但我看不到使用此Web服务的另一种方式。

    要完成,我不需要拥有UserProvider,因为我的身份验证是在远程服务上进行的。但显然,Symfony组件需要用户提供商(不管它的类型)。

    我提前感谢你

    编辑:为了使其更简单,是否可以在UserProvider类(实现UserProviderInterface)中的loadUserByUsername()函数中传递更多的$ username变量?我需要让用户通过他/她的用户名来检索用户对象。

1 个答案:

答案 0 :(得分:3)

AuthenticationProvider通常会调用UserProvider.loadUserByUsername。在您的情况下,没有必要调用它。您的身份验证方法可以负责创建用户并传回令牌。

经过身份验证的令牌最终会在会话中结束。

问题在于,默认情况下,当下一个请求进入时,系统将从会话中检索令牌/用户,然后调用UserProvider.refreshUser($ user),默认情况下,再次使用loadUserByUsername重新加载用户。

因此,您需要创建自己的用户提供程序,并让refreshUser返回相同的用户。您只需要一个loadUserByUsername来满足接口,但永远不应该调用它。

如果您确实希望定期从Web服务刷新用户,则需要添加自己的侦听器以从会话中加载令牌并覆盖默认行为。