Silex security.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'],访问规则,然后重试,那么它将正确防火墙端点,两个打开的端点返回正确的响应,其余端点返回 302。

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

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

这是一个仅供内部使用的系统,不在公共生产中,并且只有几个人使用该系统,因此它不一定需要遵守具有正确状态代码的所有常规准则等。

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

Symfony Security组件,默认情况下隔离每个防火墙,也就是说,如果你通过一个防火墙进行身份验证,你不会对所有防火墙进行身份验证!

我发现您可以为所有防火墙设置相同的上下文,然后同时对 winthin 进行身份验证。

如果您已经登陆这里,请在 Silex 中检查上下文设置的这个小问题(感谢您的通知@AndrewPlank)

另外,请注意 Silex EOL

最新更新