安全访问控制如何工作?

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.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
1 2 3 4 5 6 7 8 9
#配置/包/ security.yaml安全:#……access_control:-路径:^ /管理,角色:ROLE_USER_IP,知识产权:127.0比上年1。-路径:^ /管理,角色:ROLE_USER_PORT,知识产权:127.0比上年1。端口:8080-路径:^ /管理,角色:ROLE_USER_HOST,主持人:欧宝娱乐app下载地址symfony \ com美元-路径:^ /管理,角色:ROLE_USER_METHOD,方法:(帖子,把)-路径:^ /管理,角色:ROLE_USER

对于每个传入的请求,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使用Match。
/管理/用户 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 得到 规则#5 (ROLE_USER 知识产权宿主而且方法防止前三个条目匹配。但是由于URI匹配路径模式ROLE_USER入口,它被使用。
/ foo 127.0.0.1 80 欧宝娱乐app下载地址www.oldmanjams.com 帖子 不匹配条目 这个不匹配access_control规则,因为它的URI不匹配任何路径值。

2.访问执行

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

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

提示

如果访问被拒绝,系统将尝试验证用户(例如将用户重定向到登录页面)。如果用户已经登录,则会显示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比上年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
#配置/包/ security.yaml安全:#……access_control:-路径:^ / _internal /安全allow_if:"'127.0.0.1' == request.getClientIp()或is_granting ('ROLE_ADMIN')"

在这种情况下,当用户试图访问以/ _internal /安全时,只有IP地址为127.0.0.1或者如果用户有ROLE_ADMIN的角色。

在表达式内部,您可以访问许多不同的变量和函数,包括请求,就是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许可证。