如何根据Symfony 4中的“ dev / prod”环境允许/拒绝路由?

时间:2019-02-05 09:33:08

标签: php symfony access-control

我正在使用Symfony 4.1。 我试图根据“开发” /“生产”环境允许/拒绝路由。

我试图为每个环境定义不同的security配置文件,但我不允许。加载Symfony缓存时显示以下消息: 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:
    access_control:
        - { path: '^/$' , roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: '^/ping$' , roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: '^/docs\.json$' , roles: IS_AUTHENTICATED_ANONYMOUSLY }

我想在docs.json环境中允许(未经身份验证)dev路由,并在docs.json环境中限制(有身份验证)prod路由。

关于如何做到这一点的任何想法?

3 个答案:

答案 0 :(得分:1)

您可以尝试在注释中添加condition: "%kernel.environment% === 'dev'"或用于定义路线的任何内容。

答案 1 :(得分:0)

因此,我通过设置dev防火墙并更新模式以绕过安全性来解决此问题。

security:
    access_control:
        - { path: '^/$' , roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: '^/ping$' , roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: '^/docs\.json$' , roles: IS_AUTHENTICATED_ANONYMOUSLY }
    firewalls:
        dev:
            pattern: '^/(_(profiler|wdt)|css|images|js|docs)/'
            security: false

答案 2 :(得分:0)

在每个Symfony环境(开发,测试,生产)中都使用security.firewalls.dev:配置!

在Symfony 4中,要使某些路由仅在某些环境中可用,您可以执行以下操作:

设置:

config/packages/security.yaml

parameters:
    # Adds a fallback SECURITY_DEV_PATTERN if the env var is not set.
    env(SECURITY_DEV_PATTERN): '^/(_(profiler|wdt)|css|images|js)/'

security:
    firewalls:
        dev:
            pattern: '%env(SECURITY_DEV_PATTERN)%'
            security: false

按Symfony环境覆盖:

创建一个新文件config/packages/dev/parameters.yaml

parameters:
    env(SECURITY_DEV_PATTERN): '^/(_(profiler|wdt)|css|images|js)/|^/docs'

现在/docs仅在Symfony开发环境中没有防火墙的情况下可用

使用环境变量覆盖:

您还可以覆盖SECURITY_DEV_PATTERN文件中的.env

SECURITY_DEV_PATTERN=^/(_(profiler|wdt)|css|images|js)/|^/docs

仅当您不在生产环境中包含.env或在其中特别覆盖SECURITY_DEV_PATTERN环境变量时,此方法才有效。