spomky-labs/ip-filter-bundle

该包已被废弃,不再维护。没有推荐替代包。

Symfony2 Ip Filter Bundle

安装: 56

依赖者: 0

推荐者: 0

安全: 0

星标: 5

关注者: 2

分支: 1

开放问题: 1

类型:symfony-bundle

1.2.6 2014-03-04 23:16 UTC

README

Build Status Scrutinizer Quality Score HHVM Status

SensioLabsInsight

Latest Stable Version Total Downloads Latest Unstable Version License

此包可以帮助您使用 IP 地址IP 地址范围 限制应用程序的访问。

它支持 IPv4 和 IPv6 地址以及多个环境。

例如,您可以在 devtest 环境中允许从 192.168.1.1192.168.1.100 的地址范围,并拒绝所有其他地址。

请注意,与类似功能提供的 .htaccess 文件等相比,此包在性能方面表现不佳。

先决条件

此版本的包至少需要 Symfony 2.3。它需要 Doctrine。支持 Doctrine ORM,但使用例如 Doctrine ODM 可能更简单。

已在 PHP 5.3PHP 5.6HHVM 上使用 Symfony 2.3Symfony 2.6 进行测试。

策略

请注意,授权 IP 地址的优先级高于未授权 IP 地址。例如,如果地址范围 192.168.1.10192.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 地址和范围。

因此,您的第一项任务是为您应用程序创建 IpRange 类。这些类可以看起来和表现成您想要的样子:添加任何有用的属性或方法。

在下文中,您将看到您的类应该如何的样子。

您的类可以位于应用程序中的任何包内。例如,如果您在 "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\IpManagerInterfaceSpomkyLabs\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 }

如何

小例子

如何在 devtest 环境中授予对 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);