lyrasoft/firewall

LYRASOFT 的防火墙软件包

安装: 112

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放性问题: 1

类型:windwalker-package

0.1.6 2024-08-05 18:27 UTC

This package is auto-updated.

Last update: 2024-09-05 18:44:05 UTC


README

安装

通过 composer 安装

composer require lyrasoft/firewall

然后将文件复制到项目中

php windwalker pkg:install lyrasoft/firewall -t routes -t migrations

语言文件

如果您不想覆盖语言,请将此行添加到管理器 & 前端中间件中

$this->lang->loadAllFromVendor('lyrasoft/firewall', 'ini');

// OR
$this->lang->loadAllFromVendor(\Lyrasoft\Firewall\FirewallPackage::class, 'ini');

或者运行此命令以复制语言文件

php windwalker pkg:install lyrasoft/firewall -t lang

注册管理菜单

编辑 resources/menu/admin/sidemenu.menu.php

$menu->link($this->trans('unicorn.title.grid', title: $this->trans('firewall.redirect.title')))
    ->to($nav->to('redirect_list')->var('type', 'main'))
    ->icon('fal fa-angles-right');

$menu->link($this->trans('unicorn.title.grid', title: $this->trans('firewall.ip.rule.title')))
    ->to($nav->to('ip_rule_list')->var('type', 'main'))
    ->icon('fal fa-network-wired');

重定向

RedirectMiddleware 添加到 etc/app/main.php

use Lyrasoft\Firewall\Middleware\RedirectMiddleware;

    // ...

    'middlewares' => [
        \Windwalker\DI\create(
            RedirectMiddleware::class,
            ignores: [
                'admin/*'
            ]
        ),
        
        // ...
    ],

现在您可以在管理器中添加重定向记录

源路径规则

  • 在开始时添加 /,路径将从网站基本根目录进行比较(而不是域名根目录)。
  • 如果您启用了 Regex
    • 添加 * 将将路径段与任何字符串进行比较。
    • 添加 ** 将比较跨段。
    • 您可以添加自定义正则表达式规则,例如:/foo/(\d+)

目标路径

目标路径可以是相对路径:foo/bar 或完整 URL:https://simular.co/foo/bar

如果您启用了 Regex,您可以使用以 $ 开头的变量来插入匹配的字符串。例如,一个 foo/*/edit/(\d+),可以重定向到 new/path/$1/edit/$2

其他参数

  • 仅 404:只有当页面是 404 时才重定向,如果页面 URL 存在,则不会重定向。
  • 处理地区:如果该网站是多语言的,则此参数将自动检测起始语言前缀并将其自动添加到目标路径,您可以在目标路径中使用 {lang} 来自定义设置语言别名位置。

从数据库使用不同类型

重定向表有 type 列,您可以使用 admin/redirect/list/{type} 来管理不同类型。

如果您想为中间件选择类型,您可以这样做

    // ...

    'middlewares' => [
        \Windwalker\DI\create(
            RedirectMiddleware::class,
            type: 'other_type',
            ignores: [
                'admin/*'
            ]
        ),
        
        // ...
    ],

类型支持 string|Enum|array|null|false,如果您向其中发送 NULL,则表示所有重定向记录。如果您发送 FALSE,则表示不使用数据库记录。

使用自定义列表

您可以使用自定义重定向列表,自定义列表将自动启用正则表达式

此设置将合并数据库列表和自定义列表。

    // ...

    'middlewares' => [
        \Windwalker\DI\create(
            RedirectMiddleware::class,
            type: 'flower',
            list: [
                'foo/bar' => 'hello/world',            
                'foo/yoo/*' => 'hello/mountain/$1',            
            ],
            ignores: [
                'admin/*'
            ]
        ),
        
        // ...
    ],

此设置将禁用数据库列表并仅使用自定义列表。

    // ...

    'middlewares' => [
        \Windwalker\DI\create(
            RedirectMiddleware::class,
            type: false,
            list: [
                'foo/bar' => 'hello/world',            
                'foo/yoo/*' => 'hello/mountain/$1',            
            ],
            ignores: [
                'admin/*'
            ]
        ),
        
        // ...
    ],

自定义列表可以使用闭包来生成列表

// ...

    'middlewares' => [
        \Windwalker\DI\create(
            RedirectMiddleware::class,
            // ...
            list: raw(function (FooService $fooService) {
                return ...; 
            });
        ),
        
        // ...
    ],

自定义列表的重定向状态码默认为 301,如果您想使用其他状态,将其设置为
REDIRECT_DEFAULT_STATUS 环境变量。

即时重定向

如果您有某种原因不能等待 RedirectResponse 返回,您可以使用即时重定向

    // ...

    'middlewares' => [
        \Windwalker\DI\create(
            RedirectMiddleware::class,
            // ...
            instantRedirect: true,
        ),
        
        // ...
    ],

禁用

如果您想在调试模式下禁用此中间件,请添加此选项

        \Windwalker\DI\create(
            RedirectMiddleware::class,
            enabled: !WINDWALKER_DEBUG
        ),

钩子

添加 afterHit 钩子,您可以在重定向命中时进行某些操作或记录。

        \Windwalker\DI\create(
            RedirectMiddleware::class,
            afterHit: raw(function (string $dest, \Redirect $redirect) {
                \Windwalker\Core\Manager\Logger::info('Redirect to: ' . $dest);
            })
        ),

IP 允许/阻止(防火墙)

要启用 IP 规则,请将 FirewallMiddleware 添加到 front.route.php

use Lyrasoft\Firewall\Middleware\FirewallMiddleware;

    // ...

    ->middleware(
        FirewallMiddleware::class,
    )

    // ...

管理管理员 IP 规则

选择允许或阻止,并输入 IP 范围格式

支持的格式

我们使用 mlocati/ip-lib 作为 IP 范围解析器。

选择数据库类型

您也可以通过 ip-rule/list/{type} 访问不同类型的规则。

并将类型名称设置为中间件

    ->middleware(
        FirewallMiddleware::class,
        type: 'foo'
    )

类型也支持 string,array 和 enum。使用 NULL 来选择所有,使用 FALSE 来禁用数据库。

自定义列表

如果您想手动设置IP列表,则必须在FirewallMiddleware自定义列表中使用2个列表:allowListblockList

    ->middleware(
        FirewallMiddleware::class,
        type: false,
        allowList: [
            '0.0.0.0',
            '144.122.*.*',
        ],
        blockList: [
            '165.2.90.45',
            '222.44.55.66',
        ],
    )

禁用

如果您想在调试模式下禁用此中间件,请添加此选项

        \Windwalker\DI\create(
            FirewallMiddleware::class,
            enabled: !WINDWALKER_DEBUG
        ),

钩子

添加afterHit钩子,以便在IP被阻止时执行某些操作或记录。

        \Windwalker\DI\create(
            FirewallMiddleware::class,
            afterHit: raw(function (AppRequest $appRequest) {
                \Windwalker\Core\Manager\Logger::info('Attack from: ' . $appRequest->getClientIp());
            })
        ),

缓存

缓存有效期

这两个中间件都有一个cacheTtl参数,默认为3600秒。

        \Windwalker\DI\create(
            FirewallMiddleware::class,
            cacheTtl: 3600
        ),

清除缓存

每次编辑RedirectIpRule时,都会自动清除所有缓存。

缓存文件位于caches/firewall/,您可以在composer.json中添加firewall以清除缓存命令。

        "post-autoload-dump": [
            ...
            "php windwalker cache:clear renderer html firewall" <-- Add firewall 
        ],

缓存禁用

在调试模式下或当ttl设置为0时,将禁用缓存。