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

2024-05-04

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

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

为了让这个简短。我有一个网络服务,我想用它来进行身份验证。

这是我想要实现的流程:

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

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

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

我提前谢谢你

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


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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不需要 UserProvider 的自定义身份验证 的相关文章

随机推荐