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

How to override Symfony's security for a specific environment?

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

我们将使用 Cypress 测试套件在 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
    [...]

这对我来说表明所有路由的安全性都应该处于非活动状态。

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

但是授权 (security.access_control) 仍然有效。所以用户仍然需要获取角色才能访问这些路径,而无法获取角色。

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

您不能覆盖不同文件中的 security.access_control 设置 如果您尝试这样做,您会收到一条错误消息:

Configuration path "security.access_control" cannot be overwritten. You have to define all options for this path, and any of its sub-paths in one configuration section.

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