如何实现自己的选民将IP地址列入黑名单吗
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
如何实现自己的选民将IP地址列入黑名单吗
Symfob娱乐下载ony2安全组件提供几层授权用户。的一层被称为“选民”。选民是一个专用类,检查如果用户有权利被连接到应用程序。例如,Symfony2提供了ob娱乐下载一层,检查用户是否充分授权,或如果它有一些预期的角色。
创建一个定制的选民有时有用处理一个特定的情况下不是由框架。在本节中,您将学习如何创建一个将允许您的选民黑名单用户的IP。
选民的接口
一个定制的选民必须实现VoterInterface需要以下三个方法:
1 2 3 4 5 6
接口VoterInterface{函数supportsAttribute(美元属性);函数supportsClass(美元类);函数投票(TokenInterface美元令牌,美元对象数组,美元属性);}
的supportsAttribute ()
方法用于检查给定的用户属性(如果选民支持我。艾凡:一个角色,acl,等等)。
的supportsClass ()
方法是用来检查如果选民支持当前用户令牌类。
的投票()
方法必须实现业务逻辑验证用户是否授权访问。该方法必须返回以下值之一:
VoterInterface: ACCESS_GRANTED
:用户可以访问该应用程序VoterInterface: ACCESS_ABSTAIN
:选民不能决定是否用户授予VoterInterface: ACCESS_DENIED
:用户不允许访问应用程序
在这个例子中,您将检查如果用户的IP地址与黑名单地址的列表。如果用户的IP列入黑名单,你会回来VoterInterface: ACCESS_DENIED
,否则你会回来VoterInterface: ACCESS_ABSTAIN
这个选民的目的仅仅是拒绝访问,不授权访问。
创建一个定制的选民
基于它的IP黑名单用户,您可以使用请求
服务和比较对一组IP地址列入黑名单的IP地址:
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
/ / src / Acme / DemoBundle /安全/授权/选民/ ClientIpVoter.php名称空间Acme\DemoBundle\安全\授权\选民;使用ob娱乐下载\组件\DependencyInjection\ContainerInterface;使用ob娱乐下载\组件\安全\核心\授权\选民\VoterInterface;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\TokenInterface;类ClientIpVoter实现了VoterInterface{公共函数__construct(ContainerInterface美元容器数组,美元blacklistedIp=数组()){美元这- >容器=美元容器;美元这- >blacklistedIp =美元blacklistedIp;}公共函数supportsAttribute(美元属性){/ /你不会检查一个用户属性,所以返回true返回真正的;}公共函数supportsClass(美元类){/ /你的选民支持所有类型的令牌类,所以返回true返回真正的;}函数投票(TokenInterface美元令牌,美元对象数组,美元属性){美元请求=美元这- >容器- >get (“请求”);如果(in_array (美元请求- >getClientIp (),美元这- >blacklistedIp)) {返回VoterInterface::ACCESS_DENIED;}返回VoterInterface::ACCESS_ABSTAIN;}}
就是这样!选民就完成了。下一步是注入选民的安全层。可以轻松地通过服务容器。
提示
您的实现的方法
supportsAttribute ()
和supportsClass ()
不被称为内部的框架。一旦你注册
选民的投票()
方法总是会叫,不管这两个方法返回true。因此你需要调用这些方法的实现投票()
方法和返回ACCESS_ABSTAIN
如果你的选民不支持类或属性。
宣称选民作为服务
安全层注入选民,你必须声明这是一个服务,并标记为“security.voter”:
1 2 3 4 5 6 7 8
# src / Acme / AcmeBundle /资源/ config / services.yml服务:security.access.blacklist_voter:类:Acme \ \选民\ ClientIpVoter DemoBundle \安全\授权参数:[" @service_container ",[123.123.123.123,171.171.171.171]]公众:假标签:- - - - - -{名称:security.voter}
1 2 3 4 5 6 7 8 9 10
< !- - - - - -- - - - - -src/Acme/AcmeBundle/Resources/config/services.xml -->< /span><服务id=“security.access.blacklist_voter”类=“Acme \ DemoBundle \安全\ \选民\ ClientIpVoter授权”公共=“假”><论点类型=“服务”id=“service_container”严格的=“假”/ ><论点类型=“收集”><论点>123.123.123.123< /论点><论点>171.171.171.171< /论点>< /论点><标签的名字=“security.voter”/ >< /服务>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / Acme / AcmeBundle /资源/ config / services.php使用ob娱乐下载\组件\DependencyInjection\定义;使用ob娱乐下载\组件\DependencyInjection\参考;美元定义=新定义(Acme \ DemoBundle \安全\ \选民授权\ ClientIpVoter”,数组(新引用(“service_container”),数组(“123.123.123.123”,“171.171.171.171”)));美元定义- >addTag (“security.voter”);美元定义- >setPublic (假);美元容器- >setDefinition (“security.access.blacklist_voter”,美元定义);
改变访问决策策略
为了让新选民生效,您需要更改默认的访问决策策略,默认情况下,如果授予访问权限任何选民授予访问权限。
在这种情况下,选择一致
策略。不像肯定的
战略(默认),一致
策略,如果只有一个选民拒绝访问(例如ClientIpVoter
),访问是不授予给最终用户。
为此,覆盖默认的access_decision_manager
部分应用程序的配置文件中使用以下代码。
1 2 3 4 5
# app / config / security.yml安全:access_decision_manager:#策略可以:肯定,一致或共识策略:一致
1 2 3 4 5
< !- - - - - -- - - - - -app/config/security.xml -->< /span><配置>< !- - - - - -- - - - - -策略can be: affirmative, unanimous or consensus -->< /span><access-decision-manager策略=“一致”>< /配置>
1 2 3 4 5 6 7
/ / app / config / security.xml美元容器- >loadFromExtension (“安全”,数组(/ /策略可以:肯定,一致或共识“access_decision_manager”= >数组(“策略”= >“一致”)));
就是这样!现在,当用户决定是否应该访问,新选民将拒绝任何用户访问的ip黑名单列表。