【问题标题】:Custom Authentication which doesn't need UserProvider不需要 UserProvider 的自定义身份验证
【发布时间】:2013-02-20 19:19:25
【问题描述】:

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

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

为了简短。我有一个要用于身份验证的网络服务。

这是我要实现的流程:

  1. 用户提交凭据
  2. 这些凭据(需要用户名和密码)被发送到我的网络服务
  3. 如果用户名/密码正确,Web 服务会给出一个数组,其中包含用户名、角色和其他一些内容,但密码除外。 (如果凭证不正确,将返回一个包含一个字段的数组)
  4. 只要网络服务提供“大”数组,我希望用户被视为已通过身份验证。
  5. 在返回的角色函数中,我希望 Symfony 安全组件给用户相应的授权。
  6. 我希望避免为浏览的每个页面调用网络服务。

我不知道是否可以使用 Symfony 来实现这一点,当然这个工作流程似乎不是更安全,但我看不到使用这个网络服务的另一种方式。

最后,我不需要 UserProvider,因为我的身份验证是在远程服务上进行的。但显然,Symfony 组件需要一个用户提供者(不管它的类型)。

提前谢谢你

编辑:为了更简单,是否可以在 UserProvider 类(实现 UserProviderInterface)的 loadUserByUsername() 函数中传递变量 $username 以外的东西?除了用户名之外,我还需要让用户通过才能检索用户对象。

【问题讨论】:

    标签: security authentication symfony symfony-2.1


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2022-12-10
      • 1970-01-01
      • 2016-05-19
      • 2016-08-04
      • 2011-09-18
      • 2018-09-26
      相关资源
      最近更新 更多