中间件
中间件介绍
中间件使用的是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']);
......