AuthenticatorInterface :: supports()方法的目的是什么?

时间:2017-11-15 15:27:08

标签: symfony symfony-security symfony-flex symfony4

在Symfony 4中,AuthenticatorInterface::supports()方法有以下注释:

interface AuthenticatorInterface extends AuthenticationEntryPointInterface
{
    /**
     * Does the authenticator support the given Request?
     *
     * If this returns false, the authenticator will be skipped.
     *
     * @param Request $request
     *
     * @return bool
     */
    public function supports(Request $request);

我觉得这句话令人困惑。我尝试实现此操作时的第一直觉是,如果请求包含usernamepassword字段,则返回true,但后来我记得我收到的所有请求都经过身份验证,即使我不是使用登录表单。

supports()方法是否可以覆盖security.firewalls.myFirewall.pattern参数?是否可以处理多个身份验证器之间的流量?

我应该如何使用此界面?

2 个答案:

答案 0 :(得分:2)

我同意这个功能尚未完整记录(尚未)。我唯一能找到的是:

How to Create a Custom Authentication System with Guard

  

支持(请求$请求)

     

每次请求都会调用它   你的工作是决定是否应该使用验证器   请求(返回true)或是否应该跳过(返回false)。

例如:您可以使用Request检查它是否是XMLHttpRequest(AJAX),因此您可以拥有专用的AjaxAuthenticator

How to Use Voters to Check User Permissions记录了类似的功能(VoterInterface::support())。

答案 1 :(得分:0)

此接口取代了在Symfony 3.4中弃用的GuardAuthenticationInterface,并从Symfony 3.4中删除。

这种区别在于前者GuardAuthenticationInterface仅定义了返回getCredentials或任何形式凭据的NULL方法。在某些情况下,有许多方法可以获取身份验证器的凭据,getCredentials方法以任何方式处理,直到返回某些内容,或者在没有返回任何内容的情况下结束(这几乎等同于null返回)。

当您使用多个身份验证器时,您不希望每个身份验证器都返回任何内容以传递给下一个身份验证器。因此,为了返回if,yes或no,出现了这个supports方法,必须调用authenticator getCredentials方法。请注意,在新的AuthenticationInterface中,getCredentials方法始终应该返回一些内容。

这是an article from Symfony's blog that describes the move