beebmx / kirby-middleware
Kirby Middleware 提供了一种强大的机制,用于检查和过滤进入您 Kirby 网站的请求。
Requires
- php: ^8.2
- beebmx/pipeline: ^1.0
- getkirby/composer-installer: ^1.2
- laravel/serializable-closure: ^1.3
Requires (Dev)
- getkirby/cms: ^4.0
- laravel/pint: ^1.16
- pestphp/pest: ^2.34
- spatie/ray: ^1.40
README
Kirby Middleware
Kirby Middleware
提供了一种强大的机制,用于检查和过滤进入您的 Kirby
网站的请求。
概述
安装
下载
下载并将此存储库复制到 /site/plugins/kirby-middleware
。
Composer
composer require beebmx/kirby-middleware
使用
开箱即用,您无需进行任何操作即可开始使用(除了安装)。当您安装 Kirby Middleware
包时,它提供了两种管理中间件的方式,即 global
中间件和 groups
中间件。
全局中间件
此中间件将在每个 Page
上通过 Middleware
处理程序始终触发。开箱即用附带一个 TrimStrings
中间件,该中间件将删除请求中的空格。
注意
要访问此请求,您应调用 Beebmx\KirbyMiddleware\Request
实例。
Kirby\Http\Request
实例将不会被修改。
您可以使用以下方式访问经过转换的 Request
实例:
use Beebmx\KirbyMiddleware\Request; $request = Request::instance();
您可以在您的 config.php
文件中添加 global
中间件的特性
'beebmx.kirby-middleware' => [ 'global' => [ MyOwnGlobalMiddleware::class, ], ],
注意
您可以添加所需的任何中间件数量。
它们可以是 class
或 Closure
。
TrimStrings
TrimStrings
清除请求中的所有输入,但有时您需要跳过一些要修剪的 inputs
;您可以使用以下方式跳过它:
'beebmx.kirby-middleware' => [ 'exceptions' => [ 'trim' => [ 'password', 'password_confirmation', ], ], ],
并且您可以使用 Request
实例在您的控制器、模型或任何需要的地方恢复这些 inputs
use Beebmx\KirbyMiddleware\Request; Request::instance()->get('yourInput')
或者为了方便,您可以使用门面
use Beebmx\KirbyMiddleware\Facades\Request; Request::get('yourInput')
组中间件
组中间件将依赖于路由来触发。默认情况下,组中间件附带 web
、auth
和 guest
中间件,它包含一个 ValidateCsrfToken
中间件。
您可以通过在 config.php
文件中添加 routes
值来设置路由
'beebmx.kirby-middleware' => [ 'routes' => [ 'web' => [ 'blog/(:any)', 'content/(:alpha)', 'page/(:num)', ] ], ],
注意
您可以在 config.php
文件中添加一个与任何 Kirby
路由类似的 pattern
默认情况下,web
组附带 (:all)
路由。
auth
和 guest
中间件默认不活动,但您可以自定义路由来启用它们。
当然,您可以在您的 config.php
文件中添加更多功能到 web
中间件
'beebmx.kirby-middleware' => [ 'web' => [ MyOwnMiddleware::class, ], ],
如果 web
组不是您需要的,您可以在 config.php
文件中添加新的中间件组。您可以在 config.php
文件中添加它
'beebmx.kirby-middleware' => [ 'groups' => [ MyOwnMiddlewareGroup::class, ], ],
中间件组应如下所示
use Beebmx\KirbyMiddleware\MiddlewareGroups\MiddlewareGroup; class MyOwnMiddlewareGroup extends MiddlewareGroup { public string $name = 'review'; public string|array|null $routes = [ 'blog/(:any)', 'content/(:alpha)', ]; public array $group = [ ReviewBlogMiddleware::class, ReviewContentMiddleware::class, ReviewByAuthorMiddleware::class, ]; }
重要
所有组中间件类都应该扩展 Beebmx\KirbyMiddleware\MiddlewareGroups\MiddlewareGroup
类。
ValidateCsrfToken
当您在模板中使用 HTML 表单进行 POST
、PUT
、PATCH
或 DELETE
时,您应在表单中包含一个隐藏的 CSRF _token
字段,以便 CSRF 保护中间件可以验证请求。
<form method="POST" action="myPage"> <input type="hidden" name="_token" value="<?= csrf() ?>" /> </form>
注意
为了方便起见,您也可以使用 csrf
、csrf-token
或 _token
。
有时您需要忽略一些来自CSRF验证的路由
;您可以使用安全中间件来跳过它。
'beebmx.kirby-middleware' => [ 'exceptions' => [ 'csrf' => [ 'payment', 'test', ], ], ],
安全中间件
Kirby Middleware
自带两个中间件(auth
和guest
),可以根据用户认证来提高您的安全流程。
认证中间件
auth
中间件提供了一个起点来验证用户是否认证,以及用户是否有权访问给定的路由。如果没有,它将重定向到某个URL
进行适当的登录。
以下是一个示例
'beebmx.kirby-middleware' => [ 'routes' => [ 'auth' => [ 'dashboard', 'dashboard/(:all)', 'logout', ], ], 'redirections' => [ 'guest' => 'login', ], ],
注意
如果用户未认证,中间件将重定向到guest
页面。
访客中间件
guest
中间件提供了一个起点来验证访客是否为访客且未认证。如果用户已认证,它将重定向到某个URL
进入一个受保护的欢迎页面或仪表板。
以下是一个示例
'beebmx.kirby-middleware' => [ 'routes' => [ 'guest' => [ 'login', ], ], 'redirections' => [ 'auth' => 'dashboard', ], ],
注意
如果用户已认证,中间件将重定向到auth
页面。
中间件
当您创建中间件时,您可以使用一个类
或一个闭包
;它将取决于您的需求和复杂性。
中间件类
当您创建自己的中间件类时,它应该看起来像
use Beebmx\KirbyMiddleware\Request; use Closure; class ValidateSomeInformation { public function handle(Request $request, Closure $next) { // Perform action return $next($request); } }
如您所见,handle
需要两个参数:一个名为$request
的Request
和一个名为$next
的闭包
。该$request
包含通过钩子route:before
在Kirby中执行的当前请求。
第二个参数$next
,您应在处理过程结束时调用它以继续到下一个中间件验证,使用$request
。
如果您需要,一些验证可以阻止继续进行其他验证;您可以抛出一个错误或进行响应重定向
use Beebmx\KirbyMiddleware\Request; use Closure; use Kirby\Http\Response; class UserShouldBeAuthenticated { public function handle(Request $request, Closure $next) { if(empty($request->user())) { return Response::redirect('login') } return $next($request); } }
或者用一个异常
use Beebmx\KirbyMiddleware\Request; use Closure; use Kirby\Exception\ErrorPageException; class UserShouldBeAuthenticated { public function handle(Request $request, Closure $next) { if(empty($request->user())) { return throw new ErrorPageException([ 'fallback' => 'Unauthorized', 'httpCode' => 401, ]); } return $next($request); } }
闭包中间件
添加global
、web
、auth
或guest
中间件的最简单方法是使用一个闭包
;当您添加一个闭包时,它应该看起来像
use Beebmx\KirbyMiddleware\Request; use Closure; 'beebmx.kirby-middleware' => [ 'web' => [ function (Request $request, Closure $next) { // Perform action return $next($request); }, ], ],
重要
请记住调用$next
闭包以继续使用$request
进行下一个验证。
选项
禁用中间件
您可以通过更新config.php
文件中的enable
值完全禁用所有中间件验证
'beebmx.kirby-middleware' => [ 'enabled' => false, ],
外观
有一些外观
可以简化此插件的使用
插件
如果您正在创建自己的插件,并且需要使用某些类型的需求请求操作,Kirby Middleware
也适合您。
安装
首先,您需要通知Kirby Middleware
您有一些global
中间件或group
中间件要注册。
最简单的方法是使用钩子
use Kirby\Cms\App as Kirby; use Beebmx\KirbyMiddleware\Facades\Middleware; Kirby::plugin('beebmx/kirby-security', [ 'hooks' => [ 'system.loadPlugins:after' => function () { Middleware::appendToGroup('security', [ ValidateUser::class, ValidateUserRole::class, ValidateUserTeam::class, ]); }, ], ]);
全局方法
您可以将自己的验证添加到global
中间件。为此,您有几种方法。
追加
append
方法将中间件添加到global
中间件的末尾。
use Beebmx\KirbyMiddleware\Facades\Middleware; Middleware::append(ValidateVisitor::class);
前置
prepend
方法将中间件添加到global
中间件的开头。
use Beebmx\KirbyMiddleware\Facades\Middleware; Middleware::prepend(ValidateVisitor::class);
getGlobalMiddleware
getGlobalMiddleware
方法返回已注册的所有global
中间件的数组。
use Beebmx\KirbyMiddleware\Facades\Middleware; Middleware::getGlobalMiddleware();
组方法
您可以将自己的验证添加到groups
中间件。为此,您有几种方法。
追加
appendToGroup
方法将中间件添加到groups
中间件的末尾。
use Beebmx\KirbyMiddleware\Facades\Middleware; Middleware::appendToGroup('security', [ ValidateUser::class, ValidateUserRole::class, ValidateUserTeam::class, ]);
prependToGroup
prependToGroup
方法将中间件添加到groups
中间件的开头。
use Beebmx\KirbyMiddleware\Facades\Middleware; Middleware::prependToGroup('security', [ ValidateUser::class, ValidateUserRole::class, ValidateUserTeam::class, ]);
removeFromGroup
removeFromGroup
方法从一个特定的group
中间件中删除某些中间件。
use Beebmx\KirbyMiddleware\Facades\Middleware; Middleware::removeFromGroup('security', ValidateVisitor::class);
addClassToGroup
addClassToGroup
方法将 Middleware Group
类添加到 groups
中间件中。
use Beebmx\KirbyMiddleware\Facades\Middleware; Middleware::addClassToGroup(SecurityMiddlewareGroup::class);
getMiddlewareGroups
getMiddlewareGroups
方法返回所有已注册的 groups
中间件的数组。
use Beebmx\KirbyMiddleware\Facades\Middleware; Middleware::getMiddlewareGroups();
认证中间件
您可以在不使用选项的情况下自定义 Authenticate
中间件,但需要挂钩到 system.loadPlugins:after
。
redirectUsing
设置路由,如果用户未认证则进行重定向。
use Beebmx\KirbyMiddleware\Middlewares\Authenticate; Authenticate::redirectUsing('login');
setRoutes
如果您想为 AuthMiddlewareGroup
设置路由。
use Beebmx\KirbyMiddleware\MiddlewareGroups\AuthMiddlewareGroup; AuthMiddlewareGroup::setRoutes([ 'dashboard', 'logout', ]);
RedirectIfAuthenticated 中间件
您可以在不使用选项的情况下自定义 RedirectIfAuthenticated
中间件,但需要挂钩到 system.loadPlugins:after
。
redirectUsing
设置路由,如果用户已认证则进行重定向。
use Beebmx\KirbyMiddleware\Middlewares\RedirectIfAuthenticated; RedirectIfAuthenticated::redirectUsing('dashboard');
setRoutes
如果您想为 GuestMiddlewareGroup
设置路由。
use Beebmx\KirbyMiddleware\MiddlewareGroups\GuestMiddlewareGroup; GuestMiddlewareGroup::MiddlewareGroup::setRoutes([ 'login', ]);
重要
请记住,所有的组中间件类都应该扩展 Beebmx\KirbyMiddleware\MiddlewareGroups\MiddlewareGroup
类。
路线图
- 自定义挂钩
- 默认情况下更多
global
中间件 - 默认情况下更多
web
中间件 - 一个
auth
中间件组。 - 一个
guest
中间件组。
许可证
根据 MIT 许可证发布。