安全access_control是如何工作的呢?

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.3,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

安全access_control是如何工作的呢?

为每个传入请求,Symfony检查欧宝娱乐app下载地址access_control进入找到一个相匹配的当前请求。一旦它找到一个匹配access_control条目,它停止,只有第一个匹配access_control是用来执行访问。

每一个access_control有几个选项,配置两个不同的东西:

  1. 传入的请求应该匹配这个访问控制条目吗
  2. 一旦匹配,某种形式的访问限制应执行:

1。匹配选项

欧宝娱乐app下载地址Symfony创建的实例RequestMatcher为每一个access_control条目,决定是否应该使用一个给定的访问控制请求。以下access_control选项用于匹配:

  • 路径:一个正则表达式(没有分隔符)
  • 知识产权“诱导多能性”也支持:子网掩码
  • 港口:一个整数
  • 主机:一个正则表达式
  • 方法:一个或多个方法

采取以下access_control条目为例:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ security.yaml安全:#……access_control:- - - - - -{路径:“^ /管理”,角色:ROLE_USER_IP,知识产权:127.0。0< /span>。1}- - - - - -{路径:“^ /管理”,角色:ROLE_USER_PORT,知识产权:127.0。0< /span>。1,端口:8080年}- - - - - -{路径:“^ /管理”,角色:ROLE_USER_HOST,主持人:欧宝娱乐app下载地址symfony \ com美元}- - - - - -{路径:“^ /管理”,角色:ROLE_USER_METHOD,方法:(帖子,把)}#定义多个角色时,用户必须至少有一个人(就像一个或条件)- - - - - -{路径:“^ /管理”,角色:[ROLE_MANAGER,ROLE_ADMIN]}

对于每个传入请求,Symfony将决定哪个欧宝娱乐app下载地址access_control使用基于URI,客户机的IP地址,输入主机名,请求方法。记住,第一个规则相匹配,如果知识产权,港口,主机方法不指定一个条目,access_control将匹配任何知识产权,港口,主机方法:

URI 知识产权 港口 主机 方法 access_control 为什么?
/管理/用户 127.0.0.1 80年 example.com 得到 规则# 1 (ROLE_USER_IP) URI匹配路径和IP匹配知识产权
/管理/用户 127.0.0.1 80年 欧宝娱乐app下载地址www.oldmanjams.com 得到 规则# 1 (ROLE_USER_IP) 路径知识产权还是比赛。这也符合ROLE_USER_HOST条目,但只有第一个access_control匹配使用。
/管理/用户 127.0.0.1 8080年 欧宝娱乐app下载地址www.oldmanjams.com 得到 规则# 2 (ROLE_USER_PORT) 路径,知识产权港口匹配。
/管理/用户 168.0.0.1 80年 欧宝娱乐app下载地址www.oldmanjams.com 得到 规则# 3 (ROLE_USER_HOST) 知识产权第一个规则不匹配,所以第二个规则(匹配)。
/管理/用户 168.0.0.1 80年 欧宝娱乐app下载地址www.oldmanjams.com 帖子 规则# 3 (ROLE_USER_HOST) 第二条规则匹配。这也符合第三个规则(ROLE_USER_METHOD),但只有第一个匹配access_control使用。
/管理/用户 168.0.0.1 80年 example.com 帖子 规则# 4 (ROLE_USER_METHOD) 知识产权主机不匹配第一个两个条目,但第三ROLE_USER_METHOD——匹配和使用。
/管理/用户 168.0.0.1 80年 example.com 得到 规则# 4 (ROLE_MANAGER) 知识产权,主机方法防止前三个条目匹配。但自从URI匹配路径模式,那么ROLE_MANAGER(或ROLE_ADMIN使用)。
/ foo 127.0.0.1 80年 欧宝娱乐app下载地址www.oldmanjams.com 帖子 没有匹配的条目 这并不匹配任何access_control规则,因为它的URI不匹配的任何路径值。

谨慎

匹配的URI是没有完成的$ _GET参数。拒绝访问PHP代码如果你想禁止访问的基础上$ _GET参数值。

2。访问执行

一旦Sym欧宝娱乐app下载地址fony决定access_control条目匹配(如果有的话),然后它执行基于访问限制角色,allow_ifrequires_channel选项:

  • 角色如果用户没有给定的角色,然后访问被拒绝(在内部,一个AccessDeniedException抛出)。如果这个值是一个数组的多个角色,用户必须至少其中之一。
  • allow_if如果表达式返回false,那么访问被拒绝;
  • requires_channel如果传入的请求(如频道。http)这个值不匹配(如https),用户将被重定向(如重定向httphttps,反之亦然)。

提示

在幕后,数组的值角色传递的美元的属性应用程序中的每个选民的论点请求作为美元的主题。你可以通过阅读学习如何使用您的自定义属性如何使用选民来检查用户的权限

谨慎

如果你同时定义角色allow_if,你的访问决策策略是默认一个(肯定的),然后用户将被授予访问如果至少有一个有效的条件。如果这种行为不适合你的需要,改变访问决策策略

提示

如果拒绝访问,系统会对用户进行身份验证,如果没有(如将用户重定向到登录页面)。如果用户已经登录,403错误页面将显示“拒绝访问”。看到如何自定义错误页面吗为更多的信息。

匹配由IP access_control

某些情况下可能会出现当你需要一个access_control条目只有匹配请求来自一些IP地址或范围。例如,这个可以被用来拒绝访问所有请求的URL模式除了那些从可信,内部服务器。

谨慎

正如您将在下面解释的例子,“诱导多能性”选项不限制到一个特定的IP地址。相反,使用“诱导多能性”关键意味着access_control条目只会匹配这个IP地址,用户访问它从一个不同的IP地址将继续下降access_control列表。

这里是一个例子说明你是如何配置一些例子/内部*URL模式,因此它只能通过请求从本地服务器本身:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/包/ security.yaml安全:#……access_control:## ips的选项支持IP地址和子网掩码- - - - - -{路径:^ /内部的,角色:IS_AUTHENTICATED_ANONYMOUSLY,“诱导多能性”:(127.0.0.1,::1,192.168。0< /span>。1/ 24)}- - - - - -{路径:^ /内部的,角色:ROLE_NO_ACCESS}

这是它是如何工作的路径/内部的东西来自外部的IP地址10.0.0.1:

  • 第一个访问控制规则是忽略的路径匹配的IP地址不匹配或IPs上市;
  • 第二次访问控制规则启用(唯一的限制路径),所以它匹配。如果你确保没有用户ROLE_NO_ACCESS,然后访问被拒绝ROLE_NO_ACCESS可以是任何不匹配现有的角色,它只是作为一个技巧总是拒绝访问)。

但是如果同样的请求的来源127.0.0.1::1(IPv6回环地址):

  • 现在,第一个启用访问控制规则的路径知识产权匹配:允许访问用户总是IS_AUTHENTICATED_ANONYMOUSLY的角色。
  • 第二次访问规则并不像第一条规则匹配的检查。

确保由一个表达式

一旦一个access_control条目相匹配,可以通过拒绝访问角色键或使用更复杂的逻辑的一个表达式allow_if关键:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ security.yaml安全:#……access_control:- - - - - -路径:^ / _internal /安全#“角色”和“allow-if”选项工作像一个表达式,所以#获取了如果表达式是正确的或用户ROLE_ADMIN角色:“ROLE_ADMIN”allow_if:“127.0.0.1 = = request.getClientIp()或request.header.has (X-Secure-Access)”

在这种情况下,当用户试图访问任何URL开始/ _internal /安全,他们将只被授予访问IP地址127.0.0.1或一个安全的头,或者用户ROLE_ADMIN的角色。

请注意

在内部allow_if触发内置的ExpressionVoter就像这是属性中定义的一部分角色选择。

内的表达,你可以访问许多不同的变量和函数请求,这是Symfony欧宝娱乐app下载地址请求对象(如HttpFoundation组件)。

其他的函数和变量的列表,看看函数和变量

提示

allow_if表达式也可以包含自定义函数注册表达供应商

限制到一个港口

添加港口选择任何一个access_control条目要求用户通过特定端口访问这些url。这可能是有用的例子localhost: 8080

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ security.yaml安全:#……access_control:- - - - - -{路径:^ /车/结帐,角色:IS_AUTHENTICATED_ANONYMOUSLY,端口:8080年}

迫使一个通道(http、https)

你也可以要求用户访问URL通过SSL;使用requires_channel参数在任何access_control条目。如果这access_control匹配和请求使用吗http频道,用户将被重定向到https:

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ security.yaml安全:#……access_control:- - - - - -{路径:^ /车/结帐,角色:IS_AUTHENTICATED_ANONYMOUSLY,requires_channel:https}
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。