我正在尝试使用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,也不会经过身份验证,并且对于/login
是302'd。如果我试图在未经过身份验证的情况下访问任何/api/v1/*
端点(在我的示例中,是通过PostMan),我也会得到登录页面的302。
如果我删除['^/api/v1', 'ROLE_ADMIN'],
访问规则并重试,那么它将正确地防火墙端点,其中两个打开的端点返回正确的响应,其余的端点返回302。
但是,在所有情况下,来自经过身份验证的/admin/*
页面的所有AJAX请求都会返回302。
我想要的情况是,当我通过登录界面进行身份验证时,从/admin/*
页面到/api/v1/*
端点的所有AJAX请求也将进行身份验证,而当我未通过身份验证时,只有两个端点/api/v1/details
和/api/v1/failures
可以访问,所有其他端点都会以某种方式失败(最好是使用401JSON响应,更好的是使用JSON响应)
这是一个仅供内部使用的系统,不是公开生产的,而且只有几个人使用该系统,因此它不一定需要遵守所有通常的指导原则和正确的状态代码,等等。
希望有人能给我指明正确的方向!
发布于 2018-01-12 00:34:51
Symfony安全组件,默认情况下隔离每个防火墙,也就是说,如果你是在一个防火墙上进行身份验证,那么你并不是所有防火墙的身份验证!
我发现你可以在set the same context to all firewalls的同时验证winthin。
如果你已经在这里登陆,在Silex中检查this little issue的上下文设置(感谢通知@AndrewPlank)
另外,请注意Silex EOL
https://stackoverflow.com/questions/48095138
复制相似问题