代码之家  ›  专栏  ›  技术社区  ›  Andrew Plank

Silex安全。防火墙和多个防火墙

  •  0
  • Andrew Plank  · 技术社区  · 7 年前

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

    这是一个仅供内部使用的系统,不在公共生产中,而且只有几个人在使用该系统,因此它不一定需要遵循所有通常的指导原则以及正确的状态代码等。

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   mTorres    7 年前

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

    我发现你可以 set the same context to all firewalls 然后同时对winthin进行身份验证。

    如果你降落在这里,检查一下 this little issue 在Silex中设置上下文(感谢AndrewPlank的通知)

    此外,请注意 Silex EOL