如何实现自己的选民黑名单IP地址
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何实现自己的选民黑名单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地址将用户列入黑名单,可以使用请求
service,并将IP地址与黑名单中的IP地址进行比较:
12 34 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":
- YAML
- XML
- PHP
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}
更改访问决策策略
为了使新的投票人生效,您需要更改默认的访问决策策略,默认情况下,该策略授予if访问权任何选民授予访问权限。
在本例中,选择一致
策略。不像肯定的
策略(默认值),使用一致
策略,如果只有一个选民拒绝访问(例如ClientIpVoter
),访问权限不会授予最终用户。
为此,重写默认值access_decision_manager
部分,使用以下代码。
- YAML
- XML
- PHP
1 2 3 4 5
# app / config / security.yml安全:access_decision_manager:#策略可以是:肯定的,一致的或一致的策略:一致
就是这样!现在,当决定用户是否应该访问时,新的投票将拒绝访问黑名单ip列表中的任何用户。