2017-08-16 62 views
1

我想創建一個使用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_authenticatorgetCredentials()方法看起來像這樣基本上是:

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()方法被調用,而不是跳過此認證,並移動到下一個。

我的配置不正確?我誤解了這個機制嗎?
我需要做些什麼來實現這種混合動力?

+0

您是否使用AbstractGuardAuthenticator? https://symfony.com/doc/current/security/guard_authentication.html 因爲當我retrun null它完美的作品,它skeeps。 –

+0

@ArturYukhatov我做的。 –

回答

0

原來的技巧是將入口點更改爲app.authenticator.form_login