如何通过中间件在Webman的构造函数中使用JWT验证用户登录状态?
- 内容介绍
- 文章标签
- 相关推荐
本文共计805个文字,预计阅读时间需要4分钟。
由于webman是常驻内存框架,进程初始化后就不会再初始化了,因此直接在函数中传递request是不好的做法。这里使用中间件来代替:
中间件一般用于拦截请求或响应。例如:- 中间件可以用于截获请求,检查权限或参数等。- 中间件也可以用于修改响应,如添加头部信息或修改返回内容。
示例:phpuse Illuminate\Http\Request;use Illuminate\Http\Response;
// 创建一个中间件$middleware=function ($request, $next) { // 在这里处理请求 // ...
// 调用下一个中间件或控制器方法 $response=$next($request);
// 在这里处理响应 // ...
return $response;};
// 注册中间件Route::middleware($middleware)->group(function () { // 在这里注册路由 // ...});
因为webman是常驻内存框架
当前进程初始化一次后就不会再初始化了
所以构造函数里传递request是不好用的。
这里使用中间件来代替
了解中间件:中间件一般用于拦截请求或者响应。例如执行控制器前统一验证用户身份,如用户未登录时跳转到登录页面。例如响应中增加某个header头。例如统计某个uri请求占比等等。
中间件洋葱模型:中间件和控制器组成了一个经典的洋葱模型,中间件类似一层一层的洋葱表皮,控制器是洋葱芯。如果所示请求像箭一样穿越中间件1、2、3到达控制器,控制器返回了一个响应,然后响应又以3、2、1的顺序穿出中间件最终返回给客户端。也就是说在每个中间件里我们既可以拿到请求,也可以获得响应,这样我们就可以在中间件里做很多事情,例如拦截请求或者响应。
中间件接口:中间件必须实现Webman\MiddlewareInterface接口。
也就是必须实现process方法,process方法必须返回一个support\Response对象,默认这个对象由$handler($request)生成(请求将继续向洋葱芯穿越),也可以可以是response()json()xml()redirect()等助手函数生成的响应(请求停止继续向洋葱芯穿越)。
详情参照webman文档
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插件也可
本文共计805个文字,预计阅读时间需要4分钟。
由于webman是常驻内存框架,进程初始化后就不会再初始化了,因此直接在函数中传递request是不好的做法。这里使用中间件来代替:
中间件一般用于拦截请求或响应。例如:- 中间件可以用于截获请求,检查权限或参数等。- 中间件也可以用于修改响应,如添加头部信息或修改返回内容。
示例:phpuse Illuminate\Http\Request;use Illuminate\Http\Response;
// 创建一个中间件$middleware=function ($request, $next) { // 在这里处理请求 // ...
// 调用下一个中间件或控制器方法 $response=$next($request);
// 在这里处理响应 // ...
return $response;};
// 注册中间件Route::middleware($middleware)->group(function () { // 在这里注册路由 // ...});
因为webman是常驻内存框架
当前进程初始化一次后就不会再初始化了
所以构造函数里传递request是不好用的。
这里使用中间件来代替
了解中间件:中间件一般用于拦截请求或者响应。例如执行控制器前统一验证用户身份,如用户未登录时跳转到登录页面。例如响应中增加某个header头。例如统计某个uri请求占比等等。
中间件洋葱模型:中间件和控制器组成了一个经典的洋葱模型,中间件类似一层一层的洋葱表皮,控制器是洋葱芯。如果所示请求像箭一样穿越中间件1、2、3到达控制器,控制器返回了一个响应,然后响应又以3、2、1的顺序穿出中间件最终返回给客户端。也就是说在每个中间件里我们既可以拿到请求,也可以获得响应,这样我们就可以在中间件里做很多事情,例如拦截请求或者响应。
中间件接口:中间件必须实现Webman\MiddlewareInterface接口。
也就是必须实现process方法,process方法必须返回一个support\Response对象,默认这个对象由$handler($request)生成(请求将继续向洋葱芯穿越),也可以可以是response()json()xml()redirect()等助手函数生成的响应(请求停止继续向洋葱芯穿越)。
详情参照webman文档
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插件也可

