-
Notifications
You must be signed in to change notification settings - Fork 1.6k
接口授权结合路由中间件JWT使用
中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。具体参考ThinkPHP文档
JWT 全称 Json Web token,是为了在网络应用环境间传递声明而执行的一种基于json的开放标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者之间传递被认证的用户身份信息,以便于从服务器获取资源,也可以增加一些额外的其他业务逻辑所必须的声明信息,该token也可之间被用于认证,也可以被加密。
简而言之,我们这里要用到的就是jwt的加密和解密。
框架中已经composer了JWT
在本系统中将中间件都放在了每个应用模块下的middleware目录中,接下来我们就以后端接口授权进行讲解。
后端接口中间件目录:'app/adminapi/middleware'
此目录下面主要有三个中间件
AdminAuthTokenMiddleware::class : 后台登录验证中间件,这个中间件中我们会调取jwt的解密方法,解析token,验证登录是否过期,路由请求接口用户是否合法。
AdminCkeckRoleMiddleware::class : 权限规则验证中间件,验证看当前登录用户的角色身份和相对应路由功能的权限,
AdminLogMiddleware : 日志中間件,对请求路由功能中所产生的的行为进行日志记录
中间件的入口执行方法必须是handle方法,而且第一个参数是Request对象,第二个参数是一个闭包。
中间件handle方法的返回值必须是一个Response对象。
如果有其他必要任务逻辑,可以在此目录下重新生成一个中间进行处理。例如:
<?php
namespace app\adminapi\middleware;
use app\Request;
use crmeb\interfaces\MiddlewareInterface;
class DemoMiddleware{
public function handle($request, \Closure $next) {
//逻辑处理
return $next($request);
}
}
JwtAuth 获取token类
类中方法介绍:
getToken(string $type, array $params = []) 获取到token相关的结果数组
parseToken(string $jwt) 解密token 获取保存在其中的信息
verifyToken()验证token
setTokenBucket()放入令牌桶
接下来我们看订单模块的路由如何和中间件结合使用通过jwt验证角色用户信息的。
订单路由配置文件app/adminapi/route/order.php
/**
* 订单路由
*/
Route::group('order', function () {
//打印订单
Route::get('print/:id', 'v1.order.StoreOrder/order_print')->name('StoreOrderPrint');
//订单列表
Route::get('list', 'v1.order.StoreOrder/lst')->name('StoreOrderList');
//订单数据
Route::get('chart', 'v1.order.StoreOrder/chart')->name('StoreOrderChart');
...
....
.....
})->middleware([
\app\http\middleware\AllowOriginMiddleware::class,
\app\adminapi\middleware\AdminAuthTokenMiddleware::class,
\app\adminapi\middleware\AdminCkeckRoleMiddleware::class,
\app\adminapi\middleware\AdminLogMiddleware::class
]);
通过上面我们很清楚的知道通过->middleware()注册了中间件。我们上面讲的几个中间件都被注册调用,请求路由的时候会先通过中间件进行各种验证。
AdminAuthTokenMiddleware::class,后台登录验证中间件中调用后台admin授权service
在admin授权service中调用JWT。
直到所有的中间件验证通过,才能请求到符合验证的接口。