2

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

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

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

这是我要实现的流程:

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

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

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

我提前谢谢你

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

4

1 回答 1

3

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

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

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

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

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

于 2013-03-07T17:22:06.657 回答