我们的需求是,所有数据接口必须验证token后,才予以放行返回数据,虽然可以在每个方法中判断,但第一是不优雅,第二是量一多难免有遗漏的。
我们这么操作的前提是,所有 Controller 都继承自 BaseController ,如果不是,则在对应的父类进行同样的操作即可。
获取当前访问路径
通过 $pathinfo = $this->request->pathinfo(); 可以获取到当前请求的路径,如 ‘user/login’ 。
定义排除列表
包括登录在内的一些接口,我们是不需要进行拦截的,所以要定义一个排除列表。
1 2 3 4 5 6 |
$extraList = [ 'user/login', 'user/login_sms_code', 'user/reset_password_by_sms_code', 'user/wechat_login_qrcode' ]; |
验证数据
通过下方的代码,先判断是否在排除列表中,如果在,则return返回即可,如果不在则执行拦截操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
if (in_array($pathinfo, $extraList)) { return; }else{ // 验证用户信息 try { $token = new Token; $decode = $token->getTokenInfo($_SERVER['HTTP_TOKEN']); $managerInfo = \app\model\Manager::find($decode['data']->id); $this->managerInfo = $managerInfo; \think\facade\Log::write($managerInfo); } catch (\Throwable $th) { echo json(['status' => -1, 'msg' => '请先登录'])->send();exit; } } |
把上面的逻辑换成自己的逻辑即可,也许是cookie,也许是session,总之无论是什么,与之对应即可。
当然,不要尝试在最后 return json([…]); return 并不会阻止程序的下一步运行,就像 in_array 时的 return 一样,其作用只是在这里返回,不会中断。
至于最后的send方法,这个和TP的请求流、方法有关,必须调用->send()才能输出,否则会报错
Object of class think\response\Json could not be converted to string
好了,以上就是简单的设置一个公共拦截器的方法,希望能有所帮助。
原创文章,作者:蓝洛水深,如若转载,请注明出处:https://blog.lanluo.cn/13039