【问题标题】:How to allow/deny routes according the "dev/prod" environment in Symfony 4?如何根据 Symfony 4 中的“dev/prod”环境允许/拒绝路由?
【发布时间】:2019-06-29 02:05:00
【问题描述】:

我正在使用 Symfony 4.1。 我正在尝试根据“dev”/“prod”环境允许/拒绝路由。

我尝试为每个环境定义不同的 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 }

我想在dev 环境中允许(无需身份验证)docs.json 路由,并在prod 环境中限制(通过身份验证)docs.json 路由。

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

【问题讨论】:

    标签: php symfony access-control


    【解决方案1】:

    使用 Symfony ExpressionLanguage 组件,您可以尝试在注释中添加 condition: "'%kernel.environment%' === 'dev'" 或您用来定义路由的任何内容。

    【讨论】:

    • 由于路由是通过捆绑包自动生成的,因此我无法控制路由配置。
    【解决方案2】:

    所以我通过设置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
    

    【讨论】:

    • 但是防火墙被称为“dev”并不意味着它只在开发环境中有效,对吧?
    【解决方案3】:

    security.firewalls.dev: 配置用于每个 Symfony 环境(开发、测试、生产)!

    在 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 开发环境中只能在没有防火墙的情况下使用

    使用环境变量覆盖:

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

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

    这仅适用于您未在生产环境中包含 .env,或者您还专门覆盖了 SECURITY_DEV_PATTERN 环境变量的情况。

    【讨论】:

      猜你喜欢
      • 2022-06-21
      • 2019-07-31
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多