我正在尝试使用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
方法而不是跳过此身份验证器并转到下一个。
我的配置不正确吗?我误解了机制吗?
我需要做些什么才能实现这种混合体?
答案 0 :(得分:0)
事实证明,诀窍是将入口点更改为app.authenticator.form_login