4

在 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参数的方法吗?它是处理多个身份验证器之间的流程的东西吗?

我应该如何使用这个界面?

4

2 回答 2

2

我同意这个功能没有很好的记录(还)。我唯一能找到的是:

如何使用 Guard 创建自定义身份验证系统

支持(请求$请求)

这将在每个请求上调用,您的工作是决定是否应该将身份验证器用于此请求(返回 true)或是否应该跳过它(返回 false)。

例如:您可以使用Request来检查它是否是 XMLHttpRequest (AJAX),这样您就可以拥有专用AjaxAuthenticator的 .

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

于 2017-11-15T19:34:00.647 回答
0

这个接口替代了GuardAuthenticationInterfaceSymfony 3.4 中已弃用的接口,并从 Symfony 3.4 中删除。

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

当您使用多个身份验证器时,您不想等待每个验证器都没有返回任何内容以传递给下一个验证器。所以这个supports方法的出现是为了返回如果,是或否,验证器getCredentials方法必须被调用。请注意,在 newAuthenticationInterface中,getCredentials方法总是应该返回一些东西。

这是Symfony 博客中的一篇文章,描述了这一举措

于 2018-01-16T13:05:32.960 回答