Symfony安全 - 跳过后卫

时间:2017-08-16 09:16:29

标签: php symfony security

我正在尝试使用Symfony(2.8.24)防护机制创建混合api-token / form登录安全性。

我的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

getCredentials()的{​​{1}}方法基本上是这样的:

app.jwt_authenticator

因此,如果没有public function getCredentials(Request $request): ?string { $tokenString = $request->headers->get('Authorization'); if (!$tokenString) { $this->logger->warn('No authorization header'); return null; } return $tokenString; } 标题,则返回Authorization

根据Symfony的文档:

  

从请求中获取身份验证凭据并将其作为返回值   任何类型(例如关联数组)。如果返回null,则进行身份验证   将被跳过。

所以我希望在没有null标题的情况下跳过此身份验证器,但不幸的是情况并非如此。

即使Authorization返回getCredentials()(并且我已经验证它确实存在),也会调用null方法而不是跳过此身份验证器并转到下一个。

我的配置不正确吗?我误解了机制吗?
我需要做些什么才能实现这种混合体?

1 个答案:

答案 0 :(得分:0)

事实证明,诀窍是将入口点更改为app.authenticator.form_login