我正在尝试使用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/*
页面,我必须经过身份验证,所以我知道防火墙设置至少部分工作正常。但是,AJAX请求
/api/v1/*
端点来自
/管理员/*
页面,即使它们包含会话cookie,也没有经过身份验证,并且302'd to
/login
.
如果我尝试访问任何
/api/v1/*
端点虽然没有经过身份验证(在我的例子中,是通过邮递员验证的),但我在登录页面上也得到了302。
如果我删除
['^/api/v1', 'ROLE_ADMIN'],
访问规则,然后重试,它将正确地对端点设置防火墙,两个打开的端点返回正确的响应,其余端点返回302。
然而,在所有情况下,来自
/管理员/*
页面返回302。
我想要的情况是,当我通过登录界面进行身份验证时,所有AJAX请求
/api/v1/*
端点来自
/管理员/*
页面也将被验证,当我没有被验证时,只有两个端点
/api/v1/details
和
/api/v1/failures
都是可访问的,其他所有的都会以某种方式失败(最好使用401,甚至更优选使用JSON响应)
这是一个仅供内部使用的系统,不在公共生产中,而且只有几个人在使用该系统,因此它不一定需要遵循所有通常的指导原则以及正确的状态代码等。
希望有人能给我指出正确的方向!