Silex security.firewalls 和多个防火墙

Silex security.firewalls and multiple firewalls

我正在尝试使用 Silex 来保护我正在开发的内部系统上的路由。这可能是一个有点特殊的情况,我有一个接口(可在 /admin 访问),当登录时,它会调用 /api/v1/* 端点。两个端点需要完全开放,没有身份验证。这两个端点由第三方系统(也是内部)定期调用

我的 security.firewalls 配置中有以下内容:

[
    'secured' => [
        'pattern' => '^/admin',
        'http' => false,
        'form' => [
            'login_path' => '/login',
            'check_path' => '/admin/login_check',
            'default_target_path' => '/admin'
        ],
        'logout' => [
            'logout_path' => '/admin/logout',
            'invalidate_session' => true,
            'target_url' => '/login'
        ],
        'users' => new UserProvider,
    ],
    'api_v1_details' => [
        'pattern' => '^/api/v1/details',
        'anonymous' => true,
    ],
    'api_v1_failures' => [
        'pattern' => '^/api/v1/failures',
        'anonymous' => true,
    ],
    'api_v1' => [
        'pattern' => '^/api/v1/',
        'anonymous' => false,
        'stateless' => false,
    ],
];

在我的 security.access_rules 中,我有:

[
    ['^/admin', 'ROLE_ADMIN'],
    ['^/api/v1', 'ROLE_ADMIN'],
]

我可以成功登录,并且为了访问任何 /admin/* 页面,我必须经过身份验证,所以我知道防火墙设置至少部分有效。但是,从 /admin/* 页面向 /api/v1/* 端点发出的 AJAX 请求,即使它们包含会话 cookie,也未通过身份验证,并且是 302 到 /login。 如果我在未经过身份验证的情况下尝试访问任何 /api/v1/* 端点(在我的情况下,通过 PostMan),我也会收到登录页面的 302。

如果我删除 ['^/api/v1', 'ROLE_ADMIN'], 访问规则,然后重试,那么它将正确地防火墙端点,两个打开的端点 return 得到正确的响应,其余的端点 return302.

但是,在任何情况下,所有 AJAX 来自经过身份验证的 /admin/* 页面的请求 return 302。

我想要的情况是,当我通过登录界面进行身份验证时,所有从 /admin/* 页面到 /api/v1/* 端点的 AJAX 请求也将被身份验证,并且当我没有经过身份验证,只有 /api/v1/details/api/v1/failures 这两个端点是可访问的,所有其他端点都以某种方式失败(最好是 401,更好是 JSON 响应)

这是一个仅供内部使用的系统,未在 public 生产中,并且只有少数人使用该系统,因此不一定需要遵守所有常规具有正确状态代码等的指南

希望有人能给我指出正确的方向!

Symfony 安全组件,默认情况下隔离每个防火墙,即,如果您针对一个防火墙进行身份验证,您就不会对所有防火墙进行身份验证!

我发现您可以 set the same context to all firewalls 然后同时验证 winthin。

如果您已到达此处,请检查 this little issue 和 Silex 中的上下文设置(感谢@AndrewPlank 的通知)

此外,请注意 Silex EOL