如何实现自己的选民黑名单IP地址
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.5,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何实现自己的选民黑名单IP地址
Symfob娱乐下载ony Security组件提供了几个层来授权用户。其中一层被称为“选民”。voter是一个专用的类,用于检查用户是否具有连接到应用程序或访问特定资源/URL的权限。例如,Symfony提供了一ob娱乐下载个层来检查用户是否被完全授权,或者它是否有一些预期的角色。
有时候,创建一个自定义投票人来处理框架没有处理的特定情况是有用的。在本节中,您将学习如何创建一个投票人,允许您根据用户的IP将其列入黑名单。
选民界面
自定义投票人必须实现VoterInterface,需要以下三种方法:
1 2 3 4 5 6
接口VoterInterface{公共函数supportsAttribute($属性);公共函数supportsClass($类);公共函数投票(TokenInterface$令牌,$对象数组,$属性);}
的supportsAttribute ()方法用于检查投票人是否支持给定的用户属性(即:像ROLE_USER
, ACL编辑
等)。
的supportsClass ()方法用于检查投票人是否支持正在检查其访问权限的对象的类。
的投票()方法必须实现验证用户是否具有访问权限的业务逻辑。该方法必须返回以下值之一:
VoterInterface: ACCESS_GRANTED
:授权将由该投票人授予;VoterInterface: ACCESS_ABSTAIN
:选民无法决定是否给予授权;VoterInterface: ACCESS_DENIED
:该授权将被该选民拒绝。
在本例中,您将检查用户的IP地址是否与黑名单地址列表相匹配,“某些东西”将是应用程序。如果用户的IP被列入黑名单,您将返回VoterInterface: ACCESS_DENIED
,否则你会回来的VoterInterface: ACCESS_ABSTAIN
因为这个投票人的目的只是拒绝访问,而不是授予访问。
创建自定义投票人
如果要根据IP地址将用户列入黑名单,可以使用request_stack
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 38 39 40
/ / src / AppBundle /安全/授权/选民/ ClientIpVoter.php名称空间AppBundle\安全\授权\选民;使用ob娱乐下载\组件\HttpFoundation\RequestStack;使用ob娱乐下载\组件\安全\核心\授权\选民\VoterInterface;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\TokenInterface;类ClientIpVoter实现了VoterInterface{受保护的$requestStack;私人$blacklistedIp;公共函数__construct(RequestStack$requestStack数组,$blacklistedIp=数组()){$这->requestStack =$requestStack;$这->blacklistedIp =$blacklistedIp;}公共函数supportsAttribute($属性){//你不会检查用户属性,所以返回true返回真正的;}公共函数supportsClass($类){//你的投票人支持所有类型的令牌类,所以返回true返回真正的;}公共函数投票(TokenInterface$令牌,$对象数组,$属性){$请求=$这->requestStack->getCurrentRequest ();如果(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:类:AppBundle \安全\ \选民\ ClientIpVoter授权参数:[" @request_stack ",[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列表中的任何用户。
另请参阅
有关更高级的用法,请参阅授权.