ac/firewall

PHP 5.3+ 请求验证组件。

dev-master 2012-08-27 20:37 UTC

This package is not auto-updated.

Last update: 2024-09-14 12:58:07 UTC


README

此组件为可用于验证任何传入 Request 实例的认证系统提供了一个起点。要使用它,只需根据您喜欢的配置方式配置 Firewall 实例,并使用 Firewall::verifyRequest 告诉它验证一个 Request 对象即可。

防火墙通过提供自己的事件系列,您可以使用自己的代码将其挂钩以实现所需的任何类型的认证程序。

如果防火墙成功验证请求,则返回 true。如果失败,则可能返回一个响应实例,或者抛出异常。

用法

以下是基于 IP 黑名单和/或白名单验证传入请求的防火墙的基本用法。它需要一些设置,如果与提供配置和依赖注入解决方案的框架一起使用,则非常有用。

<?php
use AC\Component\Firewall\Firewall;
use AC\Component\Firewall\Event\FirewallEvents;
use AC\Component\Firewall\Listener\IpBlacklist;
use AC\Component\Firewall\Listener\IpWhitelist;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$firewall = new Firewall();

$ipWhitelist = new IpRangeFilter(array('192.168.100.*', '10.0.*.*'), IpRangeFilter::WHITELIST);
$firewall->addListener(FirewallEvents::REQUEST, array($whitelist, 'onFirewallRequest'));

$ipBlacklist = new IpRangeFilter(array('10.0.100.*'), IpRangeFilter::BLACKLIST);
$firewall->addListener(FirewallEvents::REQUEST, array($ipBlacklist, 'onFirewallRequest'));

//if it fails, exceptions will be thrown to be handled by your application, or a Firewall listener may
//handle a failure internally by returning a response
$result = $firewall->verifyRequest(Request::createFromGlobals());

if ($result instanceof Response) {
    $result->send();
}

上述配置将仅允许来自本地网络的请求通过,但仍然拒绝来自匹配 10.0.100.* 的客户端地址的请求。它将在所有请求上应用这些检查。

配置订阅者

防火墙提供了一种灵活的配置订阅者,该订阅者使用配置处理程序根据传入请求路径和请求特定配置动态注册防火墙监听器。

<?php
use AC\Component\Firewall\Firewall;
use AC\Component\Firewall\Config\ConfigSubscriber;
use AC\Component\Firewall\Config\IpBlacklistHandler;
use AC\Component\Firewall\Config\IpWhitelistHandler;
use Symfony\Component\HttpFoundation\Request;

//define dynamic firewall config by assigning handler keys + config to a path regex
$firewallRules = array(
    '^/admin' => array(
        'ip_whitelist' => array('10.*.*.*', '192.168.*),
        'ip_blacklist' => array('192.168.100.*', '192.168.252.32-192.168.252.64'),
    ),
);

//register factory handlers
$configSubscriber = new ConfigSubscriber($firewallRules);
$configSubscriber->addConfigHandler(new IpBlacklistHandler());
$configSubscriber->addConfigHandler(new IpWhitelistHandler());

//instantiate firewall with listener config
$firewall = new Firewall();
$firewall->addSubscriber($configSubscriber);

//verify the request
$result = $firewall->verifyRequest(Request::createFromGlobals());

此示例将特定配置应用于某些配置处理程序,但仅当请求路径与任何规则匹配时。在这种情况下,只有来自内部网络的请求会被允许访问以 /admin 开头的任何路由。

事件

防火墙为任何自定义认证系统提供了一系列事件以进行挂钩。事件在 AC\Component\Event\FirewallEvents 类中有记录。您可以在防火墙上注册事件或事件订阅者,就像注册其他任何 EventDispatcherInterface 实例一样。