spomky-labs / ip-filter-bundle
Symfony2 Ip Filter Bundle
Requires
- php: >=5.3.3
- doctrine/orm: >=2.2,<2.5-dev
- symfony/framework-bundle: ~2.4
Requires (Dev)
- doctrine/doctrine-bundle: ~1.0
- doctrine/doctrine-fixtures-bundle: dev-master
- matthiasnoback/symfony-config-test: 0.*
- phpunit/phpunit: 3.7.*
- satooshi/php-coveralls: dev-master
- symfony/browser-kit: ~2.4
- symfony/class-loader: ~2.4
- symfony/expression-language: ~2.4
- symfony/finder: ~2.4
- symfony/security-bundle: ~2.4
- symfony/yaml: ~2.4
This package is auto-updated.
Last update: 2022-02-01 12:31:51 UTC
README
此包可以帮助您使用 IP 地址
和 IP 地址范围
限制应用程序的访问。
它支持 IPv4 和 IPv6 地址以及多个环境。
例如,您可以在 dev
和 test
环境中允许从 192.168.1.1
到 192.168.1.100
的地址范围,并拒绝所有其他地址。
请注意,与类似功能提供的 .htaccess
文件等相比,此包在性能方面表现不佳。
先决条件
此版本的包至少需要 Symfony 2.3
。它需要 Doctrine
。支持 Doctrine ORM
,但使用例如 Doctrine ODM
可能更简单。
已在 PHP 5.3
到 PHP 5.6
和 HHVM
上使用 Symfony 2.3
到 Symfony 2.6
进行测试。
策略
请注意,授权 IP 地址的优先级高于未授权 IP 地址。例如,如果地址范围 192.168.1.10
到 192.168.1.100
是未授权的,而 192.168.1.20
是授权的,则将授予 192.168.1.20
。
安装
安装是一个简单的 4 步过程
- 下载包
- 启用包
- 创建您的模型类
- 配置应用程序
## 第 1 步:安装包 ##
安装此包的首选方式是依赖于 Composer
composer require "spomky-labs/ip-filter-bundle" "~2.0"
## 第 2 步:启用包 ##
在内核中启用包
<?php // app/AppKernel.php public function registerBundles() { $bundles = array( // ... new SpomkyLabs\IpFilterBundle\SpomkyLabsIpFilterBundle(), ); }
## 第 3 步:创建 IP 和范围类 ##
此包需要一个数据库来持久化过滤后的 IP 地址和范围。
因此,您的第一项任务是为您应用程序创建 Ip
和 Range
类。这些类可以看起来和表现成您想要的样子:添加任何有用的属性或方法。
在下文中,您将看到您的类应该如何的样子。
您的类可以位于应用程序中的任何包内。例如,如果您在 "Acme" 公司工作,那么您可能会创建一个名为 AcmeIpBundle
的包,并将您的类放在其中。
### Ip 类:###
<?php // src/Acme/IpBundle/Entity/Ip.php namespace Acme\IpBundle\Entity; use SpomkyLabs\IpFilterBundle\Entity\Ip as BaseIp; use Doctrine\ORM\Mapping as ORM; /** * Ip * * @ORM\Table(name="ips") */ class Ip extends BaseIp { /** * @var integer $id * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; public function getId() { return $this->id; } }
简单!
<?php // src/Acme/IpBundle/Entity/Range.php namespace Acme\IpBundle\Entity; use SpomkyLabs\IpFilterBundle\Entity\Range as BaseRange; use Doctrine\ORM\Mapping as ORM; /** * Range * * @ORM\Table(name="ranges") */ class Range extends BaseRange { /** * @var integer $id * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; public function getId() { return $this->id; } }
## 第 4 步:配置应用程序 ##
设置您的类和管理员
# app/config/config.yml sl_ip_filter: ip_class: Acme\IpBundle\Entity\Ip range_class: Acme\IpBundle\Entity\Range
如果您有自己的管理员,您可以使用它们。它们只需要实现 SpomkyLabs\IpFilterBundle\Model\IpManagerInterface
或 SpomkyLabs\IpFilterBundle\Model\RangeManagerInterface
。
# app/config/config.yml sl_ip_filter: ... ip_manager: my.custom.ip.entity_manager range_manager: my.custom.range.entity_manager
### 安全策略 ###
为了让此包生效,您需要更改默认的访问决策策略,该策略默认情况下如果任何投票者授予访问权限,则授予访问权限。
您还需要在防火墙规则后面放置您的网站。
# app/config/security.yml security: access_decision_manager: strategy: unanimous … firewalls: my_site: pattern: ^/ anonymous: ~ access_control: - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
如何
小例子
如何在 dev
和 test
环境中授予对 192.168.1.10
的访问权限,并拒绝所有其他访问?
<?php $ip_manager = $this->container->get('sl_ip_filter.ip_manager'); //Use this line, even if you use a custom IP manager $range_manager = $this->container->get('sl_ip_filter.range_manager'); //Use this line, even if you use a custom Range manager //Create your IP $ip = $ip_manager->createIp(); $ip->setIp('192.168.1.10') ->setEnvironment('dev,test') ->setAuthorized(true); $ip_manager->saveIp($ip); //Create your range $range = $range_manager->createRange(); $range->setStartIp('0.0.0.1') ->setEndIp('255.255.254') ->setEnvironment('dev,test') ->setAuthorized(false); $range_manager->saveRange($range);
网络支持
可以使用Range对象来支持网络。您只需要获取第一个和最后一个IP地址。此包提供了一个范围计算器,因此您可以轻松地使用它扩展您的范围实体。
<?php $range_manager = $this->container->get('sl_ip_filter.range_manager'); //All addresses (IPv4) $range1 = $range_manager->createRangeFromNetwork('0.0.0.0/0'); $range1->setEnvironment('dev,test') ->setAuthorized(false); $range_manager->saveRange($range1); //My local network (IPv4) $range2 = $range_manager->createRangeFromNetwork('192.168.0.0/16'); $range2->setEnvironment('dev,test') ->setAuthorized(true); $range_manager->saveRange($range2); //Another local network (IPv6) $range3 = $range_manager->createRangeFromNetwork('fe80::/64'); $range3->setEnvironment('dev,test') ->setAuthorized(true); $range_manager->saveRange($range3);