Symfony安全-跳过保护

xzv2uavs  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(175)

我正在尝试使用Symfony(2.8.24)的保护机制创建一个混合的api-token/表单登录安全性。
我的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的文件:
从请求中获取身份验证凭据,并将其作为任何类型(例如关联数组)返回。如果返回null,则将跳过身份验证。
因此,当没有Authorization头时,我希望跳过此身份验证器,但不幸的是,情况并非如此。
即使getCredentials()返回null(我已经验证了它是这样的),start()方法也会被调用,而不是跳过这个验证器,继续下一个验证器。
我的配置不正确吗?我误解了机制吗?
我需要做些什么来实施这种混合?

v1l68za4

v1l68za41#

原来诀窍是将入口点更改为app.authenticator.form_login

相关问题