如何实现自己的选民黑名单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_stackservice,并将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娱乐下载组件HttpFoundationRequestStack使用ob娱乐下载组件安全核心授权选民VoterInterface使用ob娱乐下载组件安全核心身份验证令牌TokenInterfaceClientIpVoter实现了VoterInterface受保护的requestStack私人blacklistedIp公共函数__construct(RequestStackrequestStack数组,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

提示

请确保从您的主应用程序配置文件(例如:应用程序/配置/ config.yml).有关更多信息,请参阅服务容器.要阅读有关一般定义服务的更多信息,请参见服务容器一章。

更改访问决策策略

为了使新的投票人生效,您需要更改默认的访问决策策略,默认情况下,该策略授予if访问权任何选民授予访问权限。

在本例中,选择一致策略。不像肯定的策略(默认值),使用一致策略,如果只有一个选民拒绝访问(例如ClientIpVoter),访问权限不会授予最终用户。

为此,重写默认值access_decision_manager部分,使用以下代码。

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / security.yml安全:access_decision_manager:#策略可以是:肯定的,一致的或一致的策略:一致

就是这样!现在,当决定用户是否应该访问时,新的投票将拒绝访问黑名单ip列表中的任何用户。

另请参阅

有关更高级的用法,请参阅授权

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。