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
我正在尝试使用 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