扩展验证器
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 许可证获得许可。