Skip to content

中间件

中间件介绍

中间件使用的是webman的中间件,具体文档可以参考webman中间件

中间件配置

中间件配置在config/middleware.php中,saiadmin中具体配置如下,需要在自己的应用中添加,或者全局添加:

php
<?php

use plugin\saiadmin\app\middleware\SystemLog; // 日志中间件
use plugin\saiadmin\app\middleware\CheckLogin;// 登录中间件
use plugin\saiadmin\app\middleware\CheckAuth; // 权限中间件

return [
    '' => [
        CheckLogin::class,
        CheckAuth::class,
        SystemLog::class,
    ]
];

CheckLogin登录中间件

判断用户是否登录,如果未登录,返回错误信息。如果已经登录,就会写入用户信息到BaseController中,方便后续使用。

如果你希望控制器中某个方法不需要登录,可以在控制器中配置noNeedLogin数组,取消改方法的登录验证,例如:

php
/**
 * 登录控制器
 */
class LoginController extends BaseController
{

    /**
     * 不需要登录的方法
     */
    protected array $noNeedLogin = ['captcha', 'login'];

    /**
     * 获取验证码
     */
    public function captcha() : Response
    {
        $captcha = new Captcha();
        $result = $captcha->imageCaptcha();
        if ($result['result'] !== 1) {
            return $this->fail($result['message']);
        }
        return $this->success($result);
    }

CheckAuth权限中间件

判断用户是否有访问权限,如果没有权限,返回错误信息。

SystemLog日志中间件

记录用户操作日志,记录用户的操作信息,包括用户ID,操作时间,操作IP,操作方法,操作参数,操作结果等信息。

CrossDomain 跨域中间件

1、系统已内置跨域中间件CrossDomain.php, 内容如下:

php
namespace plugin\saiadmin\app\middleware;

use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;

/**
 * 跨域中间件
 */
class CrossDomain implements MiddlewareInterface
{
    public function process(Request $request, callable $handler) : Response
    {
        // 如果是options请求则返回一个空响应,否则继续向洋葱芯穿越,并得到一个响应
        $response = $request->method() == 'OPTIONS' ? response('') : $handler($request);

        // 给响应添加跨域相关的http头
        $response->withHeaders([
            'Access-Control-Allow-Credentials' => 'true',
            'Access-Control-Allow-Origin' => $request->header('origin', '*'),
            'Access-Control-Allow-Methods' => $request->header('access-control-request-method', '*'),
            'Access-Control-Allow-Headers' => $request->header('access-control-request-headers', '*'),
        ]);

        return $response;
    }
}

2、如果使自己的插件或者应用全局跨域,则需要在插件或者应用config/middleware.php中配置:

php
use plugin\saiadmin\app\middleware\CrossDomain;

return [
    '' => [
        CrossDomain::class,
    ]
];

3、在插件或者应用路由中配置,文件位置:config/route.php

php
use Webman\Route;

Route::fallback(function() {
    $response = request()->method() == 'OPTIONS' ? response('') : json(['code' => 400, 'message' => '异常请求']);
    $response->withHeaders([
        'Access-Control-Allow-Credentials' => 'true',
        'Access-Control-Allow-Origin' => request()->header('origin', '*'),
        'Access-Control-Allow-Methods' => request()->header('access-control-request-method', '*'),
        'Access-Control-Allow-Headers' => request()->header('access-control-request-headers', '*'),
    ]);
    return $response;
});


// 此处配置的路由全部能够跨域
Route::group('/api', function () {
    // 数据字典
    Route::get("/common/dict",[\plugin\saiuser\app\controller\CommonController::class, 'dictData']);
    Route::get("/common/dictAll",[\plugin\saiuser\app\controller\CommonController::class, 'dictAll']);
    
    ......