Symfony security / access_control,大量冗余条目

时间:2016-09-22 16:55:47

标签: php symfony security

security.ymlaccess_control个条目,每个条目都是:

的组合
  • 网址格式
  • 主机名模式
  • 频道要求(http,https)
  • 角色要求

我的理解是Symfony每个请求只匹配一个,但这也是强制执行HTTPS的最高级别。

那么,这是否意味着针对每个唯一网址格式/角色要求的重复规则?

  • #rules ..
  • / admin需要ROLE_ADMIN for localhost的规则
  • / admin要求ROLE_ADMIN,强制https
  • 的规则
  • / api规则需要ROLE_API for localhost
  • / api规则要求ROLE_API,强制https
  • /允许匿名访问localhost的规则
  • /允许匿名,强制https
  • 的规则
  • #more rules ..

1 个答案:

答案 0 :(得分:1)

您是对的,对于每个传入请求,Symfony将根据 URI 决定使用哪个access_control,客户端 IP地址< / em>,传入&#34;主机名称&#34;!,以及请求方法

但是为了你的幸福,有一种方法可以不重复规则并达到同样的目标。

&#34;特殊parameters.yml文件&#34;

  

它定义了通常在每台服务器上更改的值。

首先,在本地开发机器中,在app/config/parameters.yml文件中定义一个新参数,命名为&#34; requires_channel&#34;

# in your local development machine (development)
parameters:
    database_driver: pdo_mysql
    # ...
    requires_channel: http  # <- Wow! I can use this var anywhere into my configuration :)

在生产服务器中进行相同操作,但设置https

# in your deployment server (production)
# app/config/parameters.yml
parameters:
    database_driver: pdo_mysql
    # ...
    requires_channel: https # <- I need enforce https redirection now in production server

现在,您只能为每个条目定义一个规则并使用新的%requires_channel%参数:

# app/config/security.yml
security:
    # ...

    access_control:
        - { path: ^/admin, role: ROLE_ADMIN, requires_channel: '%requires_channel%' }
        # ...

%requires_channel% 其值取决于运行应用程序的主机

请注意,host属性不再重要,因为之前需要区分这两个规则。

此解决方案可以通过使用环境配置文件(config_dev.ymlconfig_prod.yml)来完成,但您可能还需要在localhost(http)中测试您的应用程序的prod环境。所以上面的解决方案对你来说应该足够了;)

我希望我能帮助你!