2017-08-16 64 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