安全access_control是如何工作的呢?
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
安全access_control是如何工作的呢?
为每个传入请求,Symfony检查欧宝娱乐app下载地址access_control
进入找到一个相匹配的当前请求。一旦它找到一个匹配access_control
条目,它停止,只有第一个匹配access_control
是用来执行访问。
每一个access_control
有几个选项,配置两个不同的东西:
1。匹配选项
欧宝娱乐app下载地址Symfony创建的实例RequestMatcher为每一个access_control
条目,决定是否应该使用一个给定的访问控制请求。以下access_control
选项用于匹配:
路径
:一个正则表达式(没有分隔符)知识产权
或“诱导多能性”
也支持:子网掩码(可以是一个逗号分隔的字符串)港口
:一个整数主机
:一个正则表达式方法
:一个或多个方法
采取以下access_control
条目为例:
- YAML
- XML
- PHP
1 2 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< /span>。1,端口:8080年}- - - - - -{路径:“^ /管理”,角色:ROLE_USER_IP,知识产权:127.0。0< /span>。1}- - - - - -{路径:“^ /管理”,角色:ROLE_USER_HOST,主持人:欧宝娱乐app下载地址symfony \ com美元}- - - - - -{路径:“^ /管理”,角色:ROLE_USER_METHOD,方法:(帖子,把)}#“诱导多能性”可以用逗号分隔,这是使用env变量时特别有用- - - - - -{路径:“^ /管理”,角色:ROLE_USER_IP,“诱导多能性”:' % env (TRUSTED_IPS) %}- - - - - -{路径:“^ /管理”,角色:ROLE_USER_IP,“诱导多能性”:(127.0.0.1,::1,' % env (TRUSTED_IPS) %]}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30
< !- - - - - -- - - - - -配置/packages/security.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><srv:参数><srv:参数关键=“env (TRUSTED_IPS)”>10.0.0.1,表示10.0.0.2< /srv:参数>< /srv:参数><配置>< !- - - - - -- - - - - -。。。- - ><规则路径=“^ /管理”角色=“ROLE_USER_PORT”知识产权=“127.0.0.1”港口=“8080”/ ><规则路径=“^ /管理”角色=“ROLE_USER_IP”知识产权=“127.0.0.1”/ ><规则路径=“^ /管理”角色=“ROLE_USER_HOST”主机=“欧宝娱乐app下载地址symfony \ com美元”/ ><规则路径=“^ /管理”角色=“ROLE_USER_METHOD”方法=“POST、PUT”/ >< !- - - - - -- - - - - -“诱导多能性”can be comma-separated, which is especially useful when using env variables -->< /span><规则路径=“^ /管理”角色=“ROLE_USER_IP”知识产权=“% env (TRUSTED_IPS) %”/ ><规则路径=“^ /管理”角色=“ROLE_USER_IP”><知识产权>127.0.0.1< /知识产权><知识产权>::1< /知识产权><知识产权>% env (TRUSTED_IPS) %< /知识产权>< /规则>< /配置>< /srv:容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
/ /配置/包/ security.php使用欧宝娱乐app下载地址\组件\DependencyInjection\ContainerBuilder;使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(ContainerBuilder美元容器,SecurityConfig美元安全){美元容器- >setParameter (“env (TRUSTED_IPS)”,“10.0.0.1,表示10.0.0.2”);/ /……美元安全- >accessControl ()- >路径(“^ /管理”)- >角色([“ROLE_USER_PORT”])- >ips ([“127.0.0.1”])- >端口(8080年);美元安全- >accessControl ()- >路径(“^ /管理”)- >角色([“ROLE_USER_IP”])- >ips ([“127.0.0.1”]);美元安全- >accessControl ()- >路径(“^ /管理”)- >角色([“ROLE_USER_HOST”])- >主机(“欧宝娱乐app下载地址symfony \ com美元”);美元安全- >accessControl ()- >路径(“^ /管理”)- >角色([“ROLE_USER_METHOD”])- >方法([“职位”,“把”]);/ / ips逗号分隔,使用env变量时尤其有用美元安全- >accessControl ()- >路径(“^ /管理”)- >角色([“ROLE_USER_IP”])- >ips ([' % env (TRUSTED_IPS) %]);美元安全- >accessControl ()- >路径(“^ /管理”)- >角色([“ROLE_USER_IP”])- >ips ([“127.0.0.1”,“::1”,' % env (TRUSTED_IPS) %]);};
5.2
支持以逗号分隔的IP地址是在Symfony 5.2中引入的。欧宝娱乐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 匹配使用。 |
/管理/用户 |
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
),用户将被重定向(如重定向http
来https
,反之亦然)。
提示
在幕后,数组的值角色
传递的美元的属性
应用程序中的每个选民的论点请求作为美元的主题
。你可以通过阅读学习如何使用您的自定义属性如何使用选民来检查用户的权限。
谨慎
如果你同时定义角色
和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}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
< !- - - - - -- - - - - -配置/packages/security.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><配置>< !- - - - - -- - - - - -。。。- - >< !- - - - - -- - - - - -的'ips' option supports IP addresses and subnet masks -->< /span><规则路径=“^ /内部”角色=“IS_AUTHENTICATED_ANONYMOUSLY”><知识产权>127.0.0.1< /知识产权><知识产权>::1< /知识产权>< /规则><规则路径=“^ /内部”角色=“ROLE_NO_ACCESS”/ >< /配置>< /srv:容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ /配置/包/ security.php使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig美元安全){/ /……美元安全- >accessControl ()- >路径(^ /内部的)- >角色([“IS_AUTHENTICATED_ANONYMOUSLY”])/ / ips的选项支持IP地址和子网掩码- >ips ([“127.0.0.1”,“::1”]);美元安全- >accessControl ()- >路径(^ /内部的)- >角色([“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.headers.has (X-Secure-Access)”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
< !- - - - - -- - - - - -配置/packages/security.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><配置>< !- - - - - -- - - - - -。。。- - >< !- - - - - -- - - - - -的'role' and 'allow-if' options work like an OR expression, so access is granted if the expression is TRUE or the user has ROLE_ADMIN -->< /span><规则路径=“^ / _internal /安全”角色=“ROLE_ADMIN”allow-if=“127.0.0.1 = = request.getClientIp()或request.headers.has (X-Secure-Access)”/ >< /配置>< /srv:容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ /配置/包/ security.php使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig美元安全){/ /……美元安全- >accessControl ()- >路径(“^ / _internal /安全”)/ /“角色”和“allow-if”选项工作像一个表达式,所以/ /获取了如果表达式是正确的或用户ROLE_ADMIN- >角色([“ROLE_ADMIN”])- >allowIf (“127.0.0.1”= = request.getClientIp()或request.headers.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年}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
< !- - - - - -- - - - - -配置/packages/security.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><配置>< !- - - - - -- - - - - -。。。- - ><规则路径=“^ /车/付款”角色=“IS_AUTHENTICATED_ANONYMOUSLY”港口=“8080”/ >< /配置>< /srv:容器>
1 2 3 4 5 6 7 8 9 10 11 12
/ /配置/包/ security.php使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig美元安全){/ /……美元安全- >accessControl ()- >路径(^ /车/结账的)- >角色([“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}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
< !- - - - - -- - - - - -配置/packages/security.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><配置>< !- - - - - -- - - - - -。。。- - ><规则路径=“^ /车/付款”角色=“IS_AUTHENTICATED_ANONYMOUSLY”requires-channel=“https”/ >< /配置>< /srv:容器>
1 2 3 4 5 6 7 8 9 10 11 12
/ /配置/包/ security.php使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig美元安全){/ /……美元安全- >accessControl ()- >路径(^ /车/结账的)- >角色([“IS_AUTHENTICATED_ANONYMOUSLY”])- >requiresChannel (“https”);};