记webman 构造函数__construct 里request问题 通过中间件 使用jwt验证用户登录状态


因为webman是常驻内存框架

当前进程初始化一次后就不会再初始化了

所以构造函数里传递request是不好用的。

这里使用中间件来代替

了解中间件:

中间件一般用于拦截请求或者响应。例如执行控制器前统一验证用户身份,如用户未登录时跳转到登录页面。例如响应中增加某个header头。例如统计某个uri请求占比等等。

中间件洋葱模型:

中间件和控制器组成了一个经典的洋葱模型,中间件类似一层一层的洋葱表皮,控制器是洋葱芯。如果所示请求像箭一样穿越中间件1、2、3到达控制器,控制器返回了一个响应,然后响应又以3、2、1的顺序穿出中间件最终返回给客户端。也就是说在每个中间件里我们既可以拿到请求,也可以获得响应,这样我们就可以在中间件里做很多事情,例如拦截请求或者响应。

中间件接口:

中间件必须实现Webman\MiddlewareInterface接口。

也就是必须实现process方法,process方法必须返回一个support\Response对象,默认这个对象由$handler($request)生成(请求将继续向洋葱芯穿越),也可以可以是response() json() xml() redirect()等助手函数生成的响应(请求停止继续向洋葱芯穿越)。

 

详情参照webman文档

https://www.workerman.net/doc/webman/middleware.html

 

下面是详细操作

在/config/middleware.php下添加

return [
    '' => [
        // .... ....
        app\middleware\ActionHook::class
    ]
];

然后在app\middleware\文件夹下添加

ActionHook.php

<?php
namespace app\middleware;

use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
use Jwt\Jwt;
use think\facade\Db;

class ActionHook implements MiddlewareInterface
{
    
    
    public function process(Request $request, callable $handler) : Response
    {
        
        $action = $request->action;
        $noAuthArr = ['login','index'];
        if(!in_array($action,$noAuthArr)){
            $head = $request->header();
            $checkjwt = Jwt::verifyToken($head['jwt']);
           
            
            $user = DB::name('users')->find($checkjwt['uid']);
            $request->user_id = $checkjwt['uid'];
            $request->user = $user;
            
            if(empty($checkjwt) || empty($checkjwt['uid']) || empty($checkjwt['token']) ){
                return json(['errcode' => -1, 'errmsg' => '登录验证失败']);
            }
            
            // return json(['errcode' => 0, 'errmsg' => 'ok','data'=>$action]);
        }        
        
        return $handler($request);
    }
}

这里引入的jwt 在上篇文章中有说明

当然 使用webman自带 jwt插件也可

posted @ 2022-07-08 17:22  Liiu  阅读(735)  评论(0编辑  收藏  举报