我想创建一个使用Symfony(2.8.24)防护机制的混合api-token/form登录安全。Symfony安全 - 跳过警卫
我security.yml看起来是这样的:
security:
acl:
connection: default
providers:
jwt:
id: app.jwt_user_provider
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
guard:
entry_point: app.jwt_authenticator
authenticators:
- app.jwt_authenticator
- app.authenticator.form_login
provider: jwt
access_control:
- { path: ^/general/info, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, role: IS_AUTHENTICATED_FULLY }
所以我有一个main
防火墙有两个配置的认证程序。入口点是app.jwt_authenticator
,回退到app.authenticator.form_login
。
我想要它,所以当没有令牌存在时,跳过app.jwt_authenticator
。
的app.jwt_authenticator
的getCredentials()
方法看起来像这样基本上是:
public function getCredentials(Request $request): ?string
{
$tokenString = $request->headers->get('Authorization');
if (!$tokenString) {
$this->logger->warn('No authorization header');
return null;
}
return $tokenString;
}
所以,如果没有Authorization
头返回null
。
而且根据Symfony的文档:
获得从所述请求的认证证书,并返回它们作为 任何类型(例如相联系的数组)。如果您返回空值,则认证 将被跳过。
所以我希望在没有Authorization
标题时跳过此验证码,但不幸的是情况并非如此。
即使getCredentials()
回报null
(我已经验证了它),该start()
方法被调用,而不是跳过此认证,并移动到下一个。
我的配置不正确?我误解了这个机制吗?
我需要做些什么来实现这种混合动力?
您是否使用AbstractGuardAuthenticator? https://symfony.com/doc/current/security/guard_authentication.html 因为当我retrun null它完美的作品,它skeeps。 –
@ArturYukhatov我做的。 –