thinkphp5拦截验证token

写一个BaseController 类

基本思路:

1、继承一个公共基类,将验证相关代码放在基类

2、根据 孩子类下的notNeedToken 来决定是否进行验证

3、验证失败后,直接响应回来

这里需要封装一个主要代码:

php 复制代码
 protected function response($data = [])
  {

    $type = $this->getResponseType();
    $response = Response::create($data, $type);
    throw new HttpResponseException($response);
  }

如果直接return 返回,是不会终止执行的,而是会继续执行到指定的控制器,所以这里的方法仿造了this-\>error() 以及 this->success()方法。

全部代码

php 复制代码
<?php

namespace app\api\controller;

use think\Controller;
use think\exception\HttpResponseException;
use think\Request;
use think\Response;

class BaseController extends Controller
{
  protected $tokenError = ''; // 错误信息
  protected $tokenInfo = null; // 解析出来的token信息
  protected $statusCode = 200;

  protected $notNeedToken = [];

  public function _initialize()
  {
    $this->checkToken();
    $this->statusCode = $this->tokenError == '' ? 200 : 401;
    if (!empty($this->tokenError)) {
      $this->response([
        'code' => 0,
        'msg' => $this->tokenError
      ]);
    }
  }

  // 检查token
  public function checkToken()
  {

    $request = Request::instance();
    $path = $request->path();
    $tokenStr = $request->header('Authorization');

    do {
      //echo '所有路由都需要执行' . $path;
      // 不在排除的路由列表当中都需要进行验证
      if (!in_array($path, $this->notNeedToken)) {
        if (empty($tokenStr)) {
          // 没有传递token
          $this->tokenError = '请先登录后操作';
          break;
        }

        [$a, $token] = explode(" ", $tokenStr);

        // 如果为空 直接返回错误
        if (empty($token)) {
          $this->tokenError = '请先登录后操作';
          break;
        }
        // 进入验证操作
        $rst = checkToken($token);
        if ($rst['code'] == 2) {
          $this->tokenError = $rst['msg'];
          break;
        }

        // token本身还没有过期
        $this->tokenInfo = $rst['data'];


        // 检查数据库表当中是否已经标记为过期了(可能执行了退出登录了)
        $appUserToken = model('api/app_user_token');
        $rst =  $appUserToken::get([
          'user_id' =>   $this->tokenInfo->id,
          'token' =>   $token
        ]);


        // 不存在该信息
        if (empty($rst)) {
          $this->tokenError = '没有该登录信息';
          break;
        }

        if ($rst['is_overtime'] == 1) {
          $this->tokenError = '登录已过期';
          break;
        }
      }
    } while (0);
  }

  protected function response($data = [])
  {

    $type = $this->getResponseType();
    $response = Response::create($data, $type);
    throw new HttpResponseException($response);
  }
}

控制器UserController

php 复制代码
class User extends BaseController
{
    //不需要验证token的接口
    protected $notNeedToken = [
        'api/user/reg',
        'api/user/login'
    ];
}
相关推荐
aq553560011 小时前
ThinkPHP5.x核心特性全解析
android·数据库·oracle·php·laravel
KevinCyao12 小时前
php彩信接口代码示例:PHP使用cURL调用彩信网关发送图文消息
android·开发语言·php
其实防守也摸鱼12 小时前
集成开发环境phpStudy安装与配置指南(包含DVWA)
网络·安全·php·web·ctf·工具配置
Cyber4K13 小时前
【Nginx专项】高级进阶架构篇-Proxy正反向代理、FastCGI及PHP-FPM介绍
运维·服务器·nginx·架构·php
传说中胖子14 小时前
Magento服务器VSCode开启XDebug方法
服务器·vscode·php
niucloud-admin15 小时前
PHP SAAS 框架常见问题——配置问题——小程序消息推送配置 Token 校验失败
php
FreeBuf_15 小时前
微软 SharePoint Server 0Day漏洞遭在野利用
microsoft·php·sharepoint
齐潇宇16 小时前
LVS 基线检查与安全加固指南(附案例)
服务器·网络·php
爱学习的小囧17 小时前
SXi LAG 链路聚合负载均衡配置全教程 | LACP 协议 + 交换机联动,新手也能落地
运维·服务器·php·负载均衡·esxi
郝学胜-神的一滴17 小时前
[系统设计] 新鲜事系统:写扩散与读扩散的实现与对比
java·设计模式·php·软件构建·需求分析·软件设计·系统设计