创建Middleware中间件:
- 在项目tp8/app/middleware目录下新建CheckToken.php
<?php
namespace app\middleware;
use think\Request;
use think\Response;
use Closure;
use DateTimeZone;
class CheckToken
{
public function handle(Request $request, Closure $next)
{
// 在这里进行 Token 验证逻辑
$token = $request->header('Authorization');
if (empty($token)) {
return Response::create(['code' => 401, 'msg' => 'Unauthorized'], 'json', 401);
}
// 进行更复杂的 Token 验证逻辑,比如解析 Token,验证有效性等
$key = "MYKEY";
$result = $this->validateJwt($token, $key);
if ($result['result']) {
$sub = $result['data']['sub'];
$role = $result['data']['role'];
// 如果验证通过,可以将用户信息存储到请求中,以便后续控制器使用
$request->user = ['uid' => $sub, 'role' => $role];
}
return $next($request);
}
}
- 注册中间件:
- 设置中间件别名:tp8/config/middleware.php中添加
<?php
// 中间件配置
return [
// 别名或分组
'alias' => [
'CheckToken' => app\middleware\CheckToken::class,
],
// 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
'priority' => [],
];
- 如果全局使用就在app/middleware.php中注册:
<?php
// 全局中间件定义文件
return [
// 全局请求缓存
// \think\middleware\CheckRequestCache::class,
// 多语言加载
// \think\middleware\LoadLangPack::class,
// Session初始化
// \think\middleware\SessionInit::class
\think\middleware\AllowCrossDomain::class,
// 验证jwt-token,这里是全局中间件
// \app\middleware\CheckToken::class,
];
- 如果局部使用,则只需要在路由配置,或控制器中定义即可:
- 在路由中配置:tp8/route/app.php中添加:
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
use think\facade\Route;
// 这里添加了路由中间件,只针对以下路由
Route::rule('api/modinfo/dosth','modinfo/doit','PUT')->middleware(app\middleware\CheckToken::class);
- 在控制器中定义并使用:tp8/app/controller/Modinfo.php
<?php
namespace app\controller;
use \think\facade\Db;
use \think\Request; // 注意,这里不能引用\think\facade\Request;因为使用了中间件,否则拿不到中间件回传的参数
header('Content-Type: text/plain; charset=utf-8');
class Modinfo extends BaseController{
// 定义中间件
// 注意:如果使用路由中间件,则不需要在此控制器中再定义,否则访问此控制器会全部通过中间件
// protected $middleware = ['CheckToken'];
public function Doit(Request $request){
//use \think\Request; 注意,这里不能引用\think\facade\Request;因为使用了中间件,否则拿不到中间件回传的参数
$user = $request->user;
var_dump($user);
}
}