Silex security.firewalls和多个防火墙

时间:2018-01-04 12:16:06

标签: silex

我试图使用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响应)

它仅供内部使用,不适用于公共生产,只有少数人使用该系统,所以它不一定需要遵守所有通常的准则与正确的状态代码等。

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

1 个答案:

答案 0 :(得分:0)

Symfony Security组件,默认情况下隔离每个防火墙,即,如果您针对一个防火墙进行了身份验证,则不是所有防火墙!

我发现您可以set the same context to all firewalls然后同时验证所有内容。

如果你已经登陆这里,请在Silex中查看this little issue上下文设置(感谢通知@AndrewPlank)

另外,请注意Silex EOL