Symfony 或关系中的多个保护身份验证器
我正在使用Symfony 2.8新的Guard身份验证系统,我希望允许用户使用两种方法中的任何一种进行身份验证。因此,我已经为这两个应用程序实现了Guard验证器,并对它们进行了如下配置:Symfony 或关系中的多个保护身份验证器,symfony,authentication,Symfony,Authentication,我正在使用Symfony 2.8新的Guard身份验证系统,我希望允许用户使用两种方法中的任何一种进行身份验证。因此,我已经为这两个应用程序实现了Guard验证器,并对它们进行了如下配置: security: firewalls: my_firewall: pattern: ^/some-pattern guard: authenticators: - my_first_auth - my_second_
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()
方法中执行相同操作?投票者应用于用户权限,而不是用于用户身份验证。他们是两个完全不同的东西。我不知道为什么要投否决票。我的答案实际上是根据作者自己的答案来解决问题的。