Symfony 或关系中的多个保护身份验证器

Symfony 或关系中的多个保护身份验证器,symfony,authentication,Symfony,Authentication,我正在使用Symfony 2.8新的Guard身份验证系统,我希望允许用户使用两种方法中的任何一种进行身份验证。因此,我已经为这两个应用程序实现了Guard验证器,并对它们进行了如下配置: security: firewalls: my_firewall: pattern: ^/some-pattern guard: authenticators: - my_first_auth - my_second_

我正在使用Symfony 2.8新的Guard身份验证系统,我希望允许用户使用两种方法中的任何一种进行身份验证。因此,我已经为这两个应用程序实现了Guard验证器,并对它们进行了如下配置:

security:
  firewalls:
    my_firewall:
      pattern: ^/some-pattern
      guard:
        authenticators:
          - my_first_auth
          - my_second_auth
        entry_point: my_first_auth
问题是它们都运行,所以如果用户第一次成功,第二次失败,他会得到一个禁止的响应。在这种情况下,我希望他成功


有没有一种方法可以在OR关系中配置多个保护身份验证器,以便在第一个成功后跳过第二个?

鉴于您的配置,您无法这样做。多个guard验证器的行为与您描述的完全相同:它们都运行


作为替代方案,我建议使用,我认为这样会更幸运,尽管我不知道实现应该是什么样子。

您的示例很肤浅,您应该描述更好的用例。如果你想得到一个简单的答案,没有什么比或更好的了

但若getCredentials方法返回null,则跳过身份验证,所以应该运行第二个(未对此进行测试)


另一个解决方案是使用一个验证器,从请求、cookie或getCredentials方法中解析凭据。

最后,我自己手动实现了一个解决方案,利用了这样一个事实:如果
getCredentials()
返回null,则跳过验证器。两个身份验证程序的代码如下所示:

class MyAuthenticator extends AbstractGuardAuthenticator {
    private $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage) {
        $this->tokenStorage = $tokenStorage;
    }

    public function getCredentials(Request $request) {
        if ($this->isAlreadyAuthenticated()) {
            return null; // Skip this authenticator
        }
        // Get the credentials and continue with this authenticator
    }

    protected function isAlreadyAuthenticated() {
        $token = $this->tokenStorage->getToken();
        return $token && $token->isAuthenticated();
    }

您是否尝试在
supports()
方法中执行相同操作?投票者应用于用户权限,而不是用于用户身份验证。他们是两个完全不同的东西。我不知道为什么要投否决票。我的答案实际上是根据作者自己的答案来解决问题的。