我试图使用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/*
页面,我必须进行身份验证,因此我知道防火墙设置至少部分正常工作。但是,来自/api/v1/*
页面的/admin/*
端点的AJAX请求,即使它们包含会话cookie,也未经过身份验证,并且是/login
的302。
如果我在未经过身份验证的情况下尝试访问任何/api/v1/*
个端点(在我的情况下,通过PostMan),我也会在登录页面上获得302.
如果我删除了['^/api/v1', 'ROLE_ADMIN'],
访问规则,然后重试,那么它将正确地防火墙端点,两个开放端点返回正确的响应,其余端点返回302.
但是,在所有情况下,来自经过身份验证的/admin/*
页面的所有AJAX请求都会返回302.
我希望的情况是,当我通过界面登录进行身份验证时,来自/api/v1/*
页面的/admin/*
个端点的所有AJAX请求也将被验证,并且当我'未经过身份验证,只有两个端点/api/v1/details
和/api/v1/failures
可访问,而其他所有端点都以某种方式失败(最好是401,更优选的是JSON响应)
它仅供内部使用,不适用于公共生产,只有少数人使用该系统,所以它不一定需要遵守所有通常的准则与正确的状态代码等。
希望有人能指出我正确的方向!
答案 0 :(得分:0)
Symfony Security组件,默认情况下隔离每个防火墙,即,如果您针对一个防火墙进行了身份验证,则不是所有防火墙!
我发现您可以set the same context to all firewalls然后同时验证所有内容。
如果你已经登陆这里,请在Silex中查看this little issue上下文设置(感谢通知@AndrewPlank)
另外,请注意Silex EOL