我想創建一個使用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我做的。 –