安全访问控制如何工作?

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.2,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

安全访问控制如何工作?

对于每个传入的请求,Symfony都会进行检查欧宝娱乐app下载地址access_control查找入口一个匹配当前请求。只要找到匹配access_control进入,它停止-只有第一个匹配access_control用于强制访问。

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

  1. 传入的请求是否与此访问控制条目匹配
  2. 一旦匹配,是否应该强制执行某种访问限制

1.匹配选项

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

  • 路径:正则表达式(不带分隔符)
  • 知识产权“诱导多能性”:也支持netmask(可以是逗号分隔的字符串)
  • 港口:整数形式
  • 宿主:正则表达式
  • 方法:一个或多个方法

采取以下措施access_control以条目为例:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15
#配置/包/ security.yaml参数:env (TRUSTED_IPS):“10.0.0.1,表示10.0.0.2”安全:#……access_control:-路径:“^ /管理”角色:ROLE_USER_PORT,知识产权:127.0.0.1端口:8080-路径:“^ /管理”角色:ROLE_USER_IP,知识产权:127.0.0.1-路径:“^ /管理”角色:ROLE_USER_HOST,主持人:欧宝娱乐app下载地址symfony \ com美元-路径:“^ /管理”角色:ROLE_USER_METHOD,方法:(帖子,把)# ips可以用逗号分隔,这在使用env变量时特别有用-路径:“^ /管理”角色:ROLE_USER_IP,“诱导多能性”:' % env (TRUSTED_IPS) %-路径:“^ /管理”角色:ROLE_USER_IP,“诱导多能性”:(127.0.0.1,:: 1,' % env (TRUSTED_IPS) %

5.2

Symfony 5.2引入了对逗号分隔IP地址的支持。欧宝娱乐app下载地址

对于每个传入的请求,Symfony将决定哪个请求欧宝娱乐app下载地址access_control根据URI、客户端IP地址、传入主机名和请求方法来使用。记住,使用第一个匹配的规则,如果知识产权港口宿主方法没有为一个条目指定,那access_control将匹配任何知识产权港口宿主方法

URI 知识产权 港口 宿主 方法 access_control 为什么?
/管理/用户 127.0.0.1 80 example.com 得到 规则2 (ROLE_USER_IP URI匹配路径和IP匹配知识产权
/管理/用户 127.0.0.1 80 欧宝娱乐app下载地址www.oldmanjams.com 得到 规则2 (ROLE_USER_IP 路径而且知识产权还是比赛。这也会匹配ROLE_USER_HOST条目,但只有第一个access_control使用Match。
/管理/用户 127.0.0.1 8080 欧宝娱乐app下载地址www.oldmanjams.com 得到 规则1 (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-匹配并使用。
/ foo 127.0.0.1 80 欧宝娱乐app下载地址www.oldmanjams.com 帖子 不匹配条目 这个不匹配access_control规则,因为它的URI不匹配任何路径值。

谨慎

URI的匹配不需要$ _GET参数。在PHP代码中拒绝访问如果您想禁止访问基于$ _GET参数值。

2.访问执行

一旦Sym欧宝娱乐app下载地址fony决定了access_control条目匹配(如果有),那么它执行的访问限制角色allow_if而且requires_channel选项:

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

提示

的数组值角色传递为美元的属性参数传递给应用程序中的每个投票人请求作为美元的主题.您可以通过阅读了解如何使用自定义属性如何使用选民检查用户权限

谨慎

如果你同时定义两者角色而且allow_if,而你的存取决策策略为默认策略(肯定的),那么如果至少有一个有效条件,用户将被授予访问权限。如果这种行为不符合你的需求,改变访问决策策略

提示

如果访问被拒绝,系统将尝试验证用户(例如将用户重定向到登录页面)。如果用户已经登录,则会显示403“access denied”错误页面。看到如何自定义错误页面获取更多信息。

根据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.1/ 24)-路径:^ /内部的角色:ROLE_NO_ACCESS

下面是路径为时的工作原理/内部的东西来自外部IP地址10.0.0.1

  • 第一个访问控制规则被忽略为路径匹配,但IP地址与列出的任一IP都不匹配;
  • 启用了第二个访问控制规则(唯一的限制是路径),所以它是匹配的。如果你确保没有用户有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 /安全# 'role'和'allow-if'选项就像一个OR表达式,所以如果表达式为TRUE或用户具有ROLE_ADMIN权限,则授予# access权限角色:“ROLE_ADMIN”allow_if:"'127.0.0.1' == request.getClientIp()或request.headers.has('X-Secure-Access')"

在这种情况下,当用户试图访问以/ _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)

您还可以要求用户通过SSL访问URL;使用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
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。