ThinkPHP6 API开发前后端分离用户信息保存在后端的方法

2023-10-27

今天在做项目的时候有一个问题就是Session在开发API的情况下官方是不推荐用的,那么问题来了,用户信息怎么保存呢?下面来记录一下我的写法。

首先我用的是JWT插件对token进行生成及验证,话不多说,撸起袖子搞起来。

首先写登录文件,我的文件创建在app/controller/admin/Login.php,创建完成之后在里面我写了一个login方法,内容如下:

    public function login(Request $request): Response
    {
        //用$data接收前端发送过来的数据
        $data = $request->param();
        //这里我用的是验证器来验证管理员账号密码是否正确
        $result = Validate::rule([
            'username' => 'unique:system_user,username^password'
        ])->check([
            'username' => $data['username'],
            'password' => sha1($data['password'])
        ]);
        //判断账号密码是否正确
        if(!$result){
            //账号密码正确的话,获取账号信息
            $userInfo = SystemUser::where('username',$data['username'])->field('id,username,nickname')->find();
            //将获取到的账号信息进行生成Token数据并保存
            $token = signToken($userInfo);
            //写入日志
            $data['userId'] = $userInfo['id'];
            $data['nickname'] = $userInfo['nickname'];
            这里是写入日志的方法,自行创建就行
            $this->log($data,true);
            return create(['access_token' => $token],'登录成功');
        }else{
            //写入日志
            $this->log($data,false);
            return create([],'账号或密码错误,请重新输入',400);
        }
    }

接下来Token的生成与验证了,我给他写在了公共文件里,需要注意的是我们要先安装JWT插件

安装JWT的方法:

composer require firebase/php-jwt

安装完成之后我们需要引入JWT插件 

use Firebase\JWT\JWT;
use Firebase\JWT\SignatureInvalidException;
use Firebase\JWT\BeforeValidException;
use Firebase\JWT\ExpiredException;

下面就是我在公共方法写的生成与验证的方法

//这里是生成Token的方法,我们接收传来的用户信息
function signToken($userInfo): string
{
    $key = '!@#$%*&';         //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当    于加密中常用的 盐  salt
    $token = array(
        "iss"=>$key,        //签发者 可以为空
        "aud"=>'',          //面象的用户,可以为空
        "iat"=>time(),      //签发时间
        "nbf"=>time()+3,    //在什么时候jwt开始生效  (这里表示生成100秒后才生效)
        "exp"=> time()+14400, //token 过期时间
        "data"=>[           //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
            //token携带的信息,从方法传进来的,如需扩展自定义添加
            'userId'=>$userInfo['id'],    //用户ID
            'username'=>$userInfo['username']    //登录账号
        ]
    );
    return JWT::encode($token, $key, "HS256");  //根据参数生成了 token
}

//这里是验证Token的方法
function checkToken($token): array
{
    $key = '!@#$%*&';
    $status = array("code" => 2);
    try {
        JWT::$leeway = 60;//当前时间减去60,把时间留点余地
        $decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,这里要和签发的时候对应
        $arr = (array)$decoded;
        $res['code'] = 1;
        $res['data'] = $arr['data'];
        return $res;

    } catch(SignatureInvalidException $e) { //签名不正确
        $status['msg'] = "签名不正确";
        return $status;
    }catch(BeforeValidException $e) { // 签名在某个时间点之后才能用
        $status['msg'] = "token失效";
        return $status;
    }catch(ExpiredException $e) { // token过期
        $status['msg'] = "token过期";
        return $status;
    }catch(Exception $e) { //其他错误
        $status['msg'] = $e;
        return $status;
    }
}

好了,登录与Token的东西都已经搞定了,接下来我们就是要在TP6里面存储我们的用户信息,撸起袖子看代码

第一步,创建登录验证的中间件:app/middleware/LoginCheck.php,代码如下:

<?php
declare (strict_types = 1);

namespace app\middleware;

use app\BaseController;
use think\Request;
use think\Response;

class LoginCheck extends BaseController
{
    /**
     * 处理请求
     *
     * @param Request       $request
     * @param Closure       $next
     * @return Response
     */
    public function handle(Request $request, \Closure $next): Response
    {
        //获取访问用户的token,我这里用的是authorization字段,大家根据自己的项目实况
        $token = $request->header('authorization');
        //因为前后端分离规范的问题,加上JWT校验的格式,提交来的Token前面携带的Bearer我给干掉
        $token = str_replace('Bearer ','',$token);
        //干掉之后就可以丢给JWT去验证这个Token是否有效了
        $result = checkToken($token);
        //验证token是否正确
        if($result['code'] !== 1){
            return create([],'请登录后在进行操作',401);
        }else{
            //验证完成之后我们给返回的用户信息写入到request里面
            $request->userInfo = $result['data'];
            return $next($request);
        }
    }
}

第二步,创建控制器的基类:app/controller/AuthBase.php,里面的代码写法:

<?php

namespace app\controller;
use app\BaseController;
use think\App;
use think\facade\Request;

class AuthBase extends BaseController
{
    //在基类设置并调用中间件
    protected $middleware = [
        'LoginCheck'
    ];


    public function __construct(App $app)
    {
        parent::__construct($app);
    }
}

好了,到此所有的代码都撸完了,接下来我们在其他方法如果想调用当前登录的用户信息,只需要调用:

//调用方法
request()->userInfo;

//返回的对象
^ {#83
  +"userId": 1
  +"username": "admin"
}

好了,基本功能就是这么实现的,自己记录一下,也顺便分享给大家做参考,如果有更好的方法,大佬们也可以分享一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ThinkPHP6 API开发前后端分离用户信息保存在后端的方法 的相关文章

  • ThinkPHP下 自定义日志输出

    项目场景 xff1a 不想调用TP的 think Log类工具 xff0c 而是自定义日志的输出路径 文件名和内容 xff1a 解决方案 xff1a 提示 xff1a 这里填写该问题的具体解决方案 xff1a 1 首先在common php
  • ThinkPHP URL路由解析

    ThinkPHP是国内非常火的一个轻量级框架 xff0c 采用MVC模式 xff0c 结构写的非常好 xff0c 今天 大象 带大家走一下ThinkPHP框架系统运行流程 xff0c 我将跟随ThinkPHP的执行进行代码讲解 xff0c
  • ThinkPHP接入EasyWechat

    使用EasyWechat接入用户登录 获取用户信息 官方文档 span class hljs preprocessor lt php span span class hljs keyword namespace span span clas
  • thinkphp中display调用模板文件详…

    模板变量赋值后就需要调用模板文件来输出相关的变量 xff0c 模板调用通过display方法来实现 我们在操作方法的最后使用 xff1a this gt display 就可以输出模板 xff0c 根据前面的模板定义规则 xff0c 因为系
  • 微信公众号配置token

    1 在微信公众平台开发 基本设置页面 点击 修改配置 按钮 填写服务器地址 URL Token和EncodingAESKey token可以任意填写 对应验证的token URL对应是可以访问到 验证token的方法 的链接 2 代码中进行
  • thinkphp6 入门(1)--安装、路由规则、多应用模式

    一 安装thinkphp6 具体参考官方文档 安装 ThinkPHP6 0完全开发手册 看云 下面仅列举重要步骤 ThinkPHP6 0的环境要求如下 PHP gt 7 2 5 1 安装Composer 2 安装稳定版thinkphp 如果
  • PHP 微信公众号拉取微信授权

    PHP 微信公众号拉取微信授权 TP6B版本 前期准备工作 1 拿到开发者id 开发秘钥 设置IP白名单 2 设置业务域名 接口安全域名 授权域名 3 根据前端传入code参数获得用户微信信息 代码如下 获得用户信息 public func
  • ThinkPHP6 API开发前后端分离用户信息保存在后端的方法

    今天在做项目的时候有一个问题就是Session在开发API的情况下官方是不推荐用的 那么问题来了 用户信息怎么保存呢 下面来记录一下我的写法 首先我用的是JWT插件对token进行生成及验证 话不多说 撸起袖子搞起来 首先写登录文件 我的文
  • thinkphp6 入门(3)--获取GET、POST请求的参数值

    一 Request对象 thinkphp提供了Request对象 其可以 支持对全局输入变量的检测 获取和安全过滤 支持获取包括 GET POST REQUEST SERVER SESSION COOKIE ENV等系统变量 以及文件上传信
  • thinkPHP 文件上传(文件太大不成功)

    thinkPHP 文件上传 文件太大不成功 补充一下上次说的文件上传 如果我们上传的文件太大而导致失败 我们可以在 php ini 这个配置文件修改两个字段 upload max filesize 50m post max size 50m
  • 震惊,微信小程序可以设置网络字体!真香

    准备工作 获取字体链接 还原设计稿的时候需要用到如下特殊字体 google 的 Montserrat https fonts google com specimen Montserrat 选择这个字体 下载全部字体 将本地的字体文件上传到自
  • 【PHP发送邮件】PHP实现发送邮件

    PHP发送邮件 Thinkphp直接使用 其他框架修改使用 1 安装 composer require phpmailer phpmailer 2 填写配置表 配置文件mail php
  • ThinkPHP5之多语言切换

    T和inkPHP5的多语言切换是个人比较欣赏的一点 真是佩服设计者 怎么想到多语言切换的 在实际开发过程中 往往不是单一语言的项目 涉及多语言的使用 这时需要多语言切换 关键函数 Lang setAllowLangList 多语言的切换函数
  • tp5中树状图数据格式的返回

    1 条件 数据库中的数据必须是无限递归数据 2 数据处理 public function treeListApi list this gt db class gt field id name parent id gt where is de
  • ThinkPHP表单验证规则归纳总结

    格式验证类 require isRequire 不得为空 number isNumber 验证字段是否为纯数字 integer isInteger 验证字段是否为整数 float isFloat 验证字段是否为浮点数 boolean isB
  • ThinkPHP5.1 工厂模式集成多个短信平台

    app index controller Sms
  • ThinkPHP怪现象:数据表新增字段后开发模式可更新运行模式无法更新

    一 情况说明 一个已经发布的程序中 数据库原有表article 字段原有id content title三个字段 原程序可以正常运行 通过大D方法可以正常的更新数据库 现在要对这个程序进行更新 数据库表article现在增加字段media
  • thinkphp6 本地开发环境window如何安装

    先下载phpstudy 再看下面的教程 tp6框架入门 如何安装tp6以及创建实例应用 Mr LiJiaLe的博客 CSDN博客
  • ThinkPHP5多语言切换项目实战

    ThinkPHP5多语言切换实战 1 在配置文件中开启多语言配置 2 然后添加多语言目录 这里创建你需要的语言包 在语言包里定义需要翻译的文本 中英文数组的键名写成一致 然后在html文件里输入 lang 键名 对应的键名 就是下图的写法
  • ThinkPhp5.1快速创建模块

    快速生成模块 生成一个test模块的指令如下 gt php think build module test 表示自动生成test模块 自动生成的模块目录包含了config controller model和view目录以及common ph

随机推荐

  • Fiddler配置显示响应时间和服务器IP

    1 Fiddler如何显示响应时间 1 在Tool bar上面找到Rules gt Customize Rules 或Ctrl R快捷键 2 在class Handlers 里面添加 function BeginRequestTime oS
  • ACE_Message_Block功能和实现浅析

    ACE Message Block实现浅析 1 概述 ACE Message Block是ACE中很重要的一个类 和ACE框架中的重要模式的实现 如ACE Reactor ACE Proactor ACE Stream ACE Task都有
  • S32K SDK使用详解之S32 SDK软件架构详解

    内容提要 引言 1 SDK的MCU平台相关设备驱动解析 SDK gt platform gt devices目录 1 1 子目录common 1 2 子目录S32K1xx 为具体使用的MCU型号 可能为 S32K116 S32K118 S3
  • sql语句中where一定要放在group by 之前

    sql语句中where一定要放在group by 之前 分组查询出来的结果是根据第一个被查询出来的数据结果作为结果的 所以如果在查询的时候需要加入条件 那么就一定要在分组之前把条件加进去 select litigant name count
  • Apache安全漏洞

    Apache安全漏洞 1 Apache中间件介绍 Apache是世界使用排名第一的Web服务器软件 它可以运行在几乎所有广泛使用的计算机平台上 由于其跨平台和安全性被广泛使用 是最流行的Web服务器端软件之一 它快速 可靠并且可通过简单的A
  • MySQL-多表查询

    多表查询 1 简介 2 笛卡尔现象 3 分类 4 sql92标准 4 1 等值连接 4 12 为表起别名 4 13 两个表的顺序可调换 4 14 加筛选 4 15 加分组 4 16 加排序 4 17 实现三表连接 4 2 非等值连接 4 3
  • NumPy的np.random.rand()用法

    np random rand 是NumPy库中的函数 用于生成在 0 1 区间内均匀分布的随机数 可以接受多个整数参数 用于指定生成数组的形状 生成一个随机标量 import numpy as np random scalar np ran
  • win10计算机找不到家庭组,Win10 家庭版 没有家庭组 这个选项,如何设置局域网 - Microsoft Community...

    您好 了解到您Windows 家庭版没有家庭组的问题 请问您当前系统版本是Windows10 1803的吗 将电脑更新到 Windows 10 版本 1803 之后 家庭组已从 Windows 10 版本 1803 中删除 家庭组将不会显示
  • ERC20(发币)

    目录 基本介绍 代币标准的目的 ERC20代币标准 最小单元 可选单元 solidity 0 6 0版本以后的不同点 实战代码展示 发币 基本介绍 ERC 旨在建立使应用程序和合约更容易相互交互的约定 与 ETH 以太坊的原生加密货币 不同
  • c++ vector 自定义排序的问题

    如果要自己定义STL容器的元素类最好满足STL容器对元素的要求 必须要求 1 Copy构造函数 2 赋值 操作符 3 能够销毁对象的析构函数 另外 1 可用的缺省构造函数 序列型容器必须 用于初始化元素 2 操作符定义 用于判断相等 3 l
  • AIStudio PaddleDetection Picodet 增量训练自己数据

    1 拷贝PaddleDetection https gitee com paddlepaddle PaddleDetection git 2 安装依赖 pip install r requirements txt 3 Vott制作自己的数据
  • ReentrantLock实现原理

    ReentrantLock主要利用CAS CLH队列来实现 它支持公平锁和非公平锁 两者的实现类似 ReentrantLock的基本实现可以概括为 先通过CAS尝试获取锁 如果此时已经有线程占据了锁 那就加入CLH队列并且被挂起 当锁被释放
  • Android中对服务器发送http请求

    当我们需要和服务器进行交互的时候 需要对远程服务器发送请求 接下来我会概述一下android中okhttp的用法 public class HttpUtil 发送Http请求类 每次发送Http请求调用该方法 通过okhttp3发送请求 用
  • 【编写高质量代码:改善Java程序的151个建议】第9章:多线程和并发___建议125~131

    建议125 优先选择线程池 建议126 适时选择不同的线程池来实现 Java线程池原理及实现 建议127 lock与synchronized是不一样的 直接上代码 package OSChina Multithread import jav
  • selenium:select下拉框

    以下两种导的包没有任何本质区别 ui包就是调用Select包中的select方法 from selenium webdriver support select import Select from selenium webdriver su
  • Excel 数据透视表如何累积求和?

    选择数据区域 插入数据透视表 将 区域 与 组别 分别拖放至 行 将 销售数量 分两次拖放至 值 字段 设置计算类型为 求和 如图所示 选择第二个 销售数量 鼠标右键单击后 在弹出的快捷菜单中依次选择 值显示 按某一字段汇总 选项 在弹出的
  • java进阶篇--Docker 有什么优点?使用时需要注意什么问题?

    Docker 从 2013 年发展到现在 它的普及率已经可以和最常用的 MySQL 和 Redis 并驾齐驱了 从最初偶尔出现在面试中 到现在几乎成为面试中必问的问题之一 如果再不了解 Docker 相关的知识点 可能就会与自己心仪的职位擦
  • LSTM的加速算法:QRNN和SRU

    LSTM介绍及加速原理 LSTM的公式可以表示如下所示 其中分别表示输入门 输出门 遗忘门 对LSTM还不熟悉的同学可以先阅读 理解LSTM网络或者直接阅读Christopher Olah 的原博文 Understanding LSTM N
  • 第一周工作周报-5

    部 门 理工大学 姓 名 邓辉波 入 职 时 间 7 18 本周已完成工作内容及总结 1 学习了HTML CSS的基础知识 2 学习了Photoshop的一些简单的知识 3 完成了javascript的第一部分内容的学习 4 制作了第一张静
  • ThinkPHP6 API开发前后端分离用户信息保存在后端的方法

    今天在做项目的时候有一个问题就是Session在开发API的情况下官方是不推荐用的 那么问题来了 用户信息怎么保存呢 下面来记录一下我的写法 首先我用的是JWT插件对token进行生成及验证 话不多说 撸起袖子搞起来 首先写登录文件 我的文