美文网首页
Thinkphp8使用中间件验证并解析请求Token

Thinkphp8使用中间件验证并解析请求Token

作者: 非新生代菜鸟 | 来源:发表于2023-12-27 13:37 被阅读0次

创建Middleware中间件:

  1. 在项目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);
    }
}
  1. 注册中间件:
  • 设置中间件别名: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,
];
  • 如果局部使用,则只需要在路由配置,或控制器中定义即可:
  1. 在路由中配置: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);
  1. 在控制器中定义并使用: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);
    }
}

相关文章

网友评论

      本文标题:Thinkphp8使用中间件验证并解析请求Token

      本文链接:https://www.haomeiwen.com/subject/efbrndtx.html