跳到内容

扩展验证器

编辑此页

JWTAuthenticator 类负责验证 JWT token。它通过 lexik_jwt_authentication.security.jwt_authenticator 抽象服务使用,该服务可以以最灵活但仍然结构化的方式进行自定义:通过扩展服务创建您自己的验证器,因此您可以在同一应用程序中管理各种安全上下文。

创建您自己的验证器

1
2
3
4
5
6
7
8
namespace App\Security;

use Lexik\Bundle\JWTAuthenticationBundle\Security\Authenticator\JWTAuthenticator;

class CustomAuthenticator extends JWTAuthenticator
{
    // Your own logic
}
1
2
3
4
5
# config/services.yaml
services:
    app.custom_authenticator:
        class: App\Security\CustomAuthenticator
        parent: lexik_jwt_authentication.security.jwt_authenticator
1
2
3
4
5
6
7
8
9
10
# config/packages/security.yaml
security:
    # ...
    firewalls:
        # ...
        api:
            pattern:   ^/api
            stateless: true
            jwt:
                authenticator: app.custom_authenticator

注意

本节的代码示例需要完成此步骤,可能不会重复。

每个验证器使用不同的 Token Extractors

Token extractors 在此扩展包的主配置中设置(参见配置参考)。如果您的应用程序包含具有不同安全上下文的多个防火墙,您可能希望配置应分别在每个防火墙上使用的不同 token extractors。这可以通过拥有与防火墙一样多的验证器来完成(对于创建验证器,请参见本主题的第一节)。

您可以在自定义验证器中覆盖 getTokenExtractor()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* @return TokenExtractor\TokenExtractorInterface
*/
protected function getTokenExtractor()
{
    // Return a custom extractor, no matter of what are configured
    return new TokenExtractor\AuthorizationHeaderTokenExtractor('Token', 'Authorization');

    // Or retrieve the chain token extractor for mapping/unmapping extractors for this authenticator
    $chainExtractor = parent::getTokenExtractor();

    // Clear the token extractor map from all configured extractors
    $chainExtractor->clearMap();

    // Or only remove a specific extractor
    $chainTokenExtractor->removeExtractor(function (TokenExtractor\TokenExtractorInterface $extractor) {
        return $extractor instanceof TokenExtractor\CookieTokenExtractor;
    });

    // Add a new query parameter extractor to the configured ones
    $chainExtractor->addExtractor(new TokenExtractor\QueryParameterTokenExtractor('jwt'));

    // Return the chain token extractor with the new map
    return $chainTokenExtractor;
}
这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可证获得许可。
TOC
    版本