如何针对特定环境覆盖Symfony的安全性?

时间:2019-08-19 10:58:55

标签: php symfony symfony4 symfony-security

我正在尝试配置Symfony的安全组件,以便在特定环境(travis)中没有为任何端点启用安全性。

在travis构建期间,我们将使用赛普拉斯测试套件执行集成测试,而我不希望在那里存在安全性。在我的config/packages/security.yaml文件中,我有以下内容:

security:
    encoders:
        Symfony\Component\Security\Core\User\User:
            algorithm: bcrypt
            cost: 12
    providers:
        in_memory:
            memory:
                users:
                    nets:
                        password: foo
                        roles: ['ROLE_NETS']
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            http_basic: ~
    access_control:
        - { path: ^/nets, roles: [ROLE_ADMIN, ROLE_NETS], requires_channel: https }

可正常使用。仅当我提供正确的HTTP基本身份验证凭据时,相应的^/nets端点才可用。

在我的config/packages/travis/security.yaml文件中,我有:

security:
    firewalls:
        main:
            pattern: ^/
            http_basic: false
            security: false
据我了解,

应该在travis环境中关闭所有端点的所有安全性。但事实并非如此,我一直得到401。运行bin/console -e travis debug:config security时,我得到以下信息:

security:
    [...]
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
            methods: {  }
            user_checker: security.user_checker
            stateless: false
            logout_on_user_change: true
        main:
            pattern: ^/
            security: false
            methods: {  }
            user_checker: security.user_checker
            stateless: false
            logout_on_user_change: true
    [...]

对我来说,这表明所有路由的安全性都应处于无效状态。

1 个答案:

答案 0 :(得分:1)

通过禁用防火墙,身份验证被禁用,因此用户无法通过您的应用程序进行身份验证。

但是授权security.access_control)仍处于活动状态。因此,用户仍然需要获得角色才能访问这些路径,并且无权获取角色。

除了更改防火墙设置之外,您还需要为每个环境定义不同的access_control规则。

您无法覆盖其他文件中的security.access_control设置,如果尝试这样做,将会得到一个错误提示:

  

配置路径“ security.access_control”不能被覆盖。您必须在一个配置部分中定义此路径的所有选项及其任何子路径。

因此,您可能需要为每个环境使用不同的security.yaml文件,定义所有必要的访问控制规则。