Laravel常用扩展sanctum与medoo的使用

安装 laravel/sanctum 扩展

1、下载sanctum扩展库

cd /usr/local/nginx/html/laravel/
composer require laravel/sanctum
#生成配置文件
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

2、为config/sanctum.php配置文件设置到期时间,sanctum是以分钟为单位

'expiration' => 60 * 2,

3、最后,你需要执行数据库迁移文件。Sanctum 将创建一个数据库表用于存储 API 令牌:
这一步生成存放token验证的数据表

php artisan migrate

4、在 app/Http/Kernel.php 文件中将 Sanctum 的中间件添加到你的 api 中间件组中:

use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;

'api' => [
    EnsureFrontendRequestsAreStateful::class,
    'throttle:60,1',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],

使用sanctum进行token验证实例

参考文档:https://learnku.com/docs/laravel/7.x/sanctum/7510
1、创建user表模型,并继承sanctum的user类(app\Model\UserModel.php)
2、创建loginApi登录接口,用于生成token并将token存入redis缓存,并根据token失效时间’expiration’ => 60 * 2设置redis值的失效时间,因为sanctum是以分钟为单位,redis是以秒为单位需要乘60换算
3、通过获取头部信息在__construct获取缓存的用户信息,并通过userInfoApi接口返回获取用户详情
4、在路由加入auth:sanctum中间件保护路由,指定哪些接口访问需要使用到token验证的

token签名

1、实现逻辑app\Http\Controller\Test\IndexController.php

#引用User模型与缓存类
use App\Model\UserModel;
use Illuminate\Support\Facades\Cache;

protected $s_user;

    public function __construct(Request $request)
    {
        //登录成功后,访问其他方法时,获取请求头存放的token信息进行验证
        $BearerToken = $request->server('HTTP_AUTHORIZATION');
        $authToken =str_replace('Bearer ','',$BearerToken);
        //根据token值作为键名从redis缓存中获取用户详细信息
        $this->s_user =Cache::get($authToken);
    }
    
# 创建loginApi登录接口,用于生成token并将token存入redis缓存,并根据token失效时间'expiration' => 60 * 2设置redis值的失效时间,因为sanctum是以分钟为单位,redis是以秒为单位需要乘60换算
public function loginApi(Request $request)
    {
        $username = $request->post('username');
        $password = $request->post('password');

        $user = UserModel::where(['username' => $username, 'password' => md5($password)])->first();
        if (!$user) {
            return ['msg' => '该用户不存在'];
        }

        //1、删除api_personal_access_tokens表历史token信息,实现单点登录
        $user->tokens()->delete();
        //2、令牌创建后,应该立即向用户展示这个纯文本值
        $token = $user->createToken('login-token')->plainTextToken;
        //3、将token存入redis缓存,并根据token失效时间'expiration' => 60 * 2设置redis值的失效时间,因为sanctum是以分钟为单位,redis是以秒为单位需要乘60换算
        $minutes = config('sanctum.expiration');
        $token = explode('|',$token);
        Cache::put($token[1], $user, $minutes * 60);
        return ['data' => ['userinfo' => $user, 'token' => $token[1]]];
    }

//获取通过header头传递的Bearer token从缓存中获取用户信息
    public function userInfoApi()
    {
        return $this->s_user;
    }

2、UserModel模型

<?php

namespace App\Model;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;

class UserModel extends Authenticatable
{
    use HasApiTokens;

    const CREATED_AT = 'create_time';
    const UPDATED_AT= 'update_time';
    protected $table = 'user';
    protected $fillable = [
        'username','password','head_url','admin','is_delete','status'
    ];
}

3、路由使用
在路由加入auth:sanctum保护路由,指定哪些接口访问需要使用到token验证的

Route::group(['namespace' => 'Test', 'prefix' => 'test'], function () {
    Route::any('login', 'IndexController@loginApi');
    #用中间件做token验证,放入一下的路由都需要通过token验证
    Route::group(['middleware'=>'auth:sanctum'], function (){
        /*Route::any('userinfo', function(Request $request){
            //return $request->server();
            //$user = \App\Model\UserModel::first();
            //return $user;
        });*/
        Route::any('userinfo', 'IndexController@userInfoApi');
    });
});

4、展示
a、生成token签名

在这里插入图片描述
b、通过签名访问用户信息接口
在这里插入图片描述
或者
在这里插入图片描述

c、通过redis服务端查看存入的token信息
在这里插入图片描述

安装 catfan/medoo扩展

官方使用文档:
https://medoo.lvtao.net/1.2/doc.collaboration.php

cd /usr/local/nginx/html/laravel/
composer require catfan/medoo

使用medoo库:
1、配置bootstrap/app.php

#在bootstrap/app.php中注册
use Illuminate\Support\Facades\Config;
use Medoo\Medoo;


// Register as database
$app->singleton(
  Illuminate\Contracts\Debug\ExceptionHandler::class,
  App\Exceptions\Handler::class
);
$app->singleton('medoo', function () {
    $config = Config::get('database.connections.mysql');
    return new Medoo([
        'database_type' => $config['driver'],
        'database_name' => $config['database'],
        'server' => $config['host'],
        'charset' => $config['charset'],
        'port' => $config['port'],
        'prefix' => $config['prefix'],
        'username' => $config['username'],
        'password' => $config['password'],
    ]);
});

2、配置.env下的数据库和redis配置

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root

BROADCAST_DRIVER=log
CACHE_DRIVER=redis
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=123456
REDIS_PORT=6379

3、配置config/database.php数据库前缀配置

'prefix' => 'api_',

测试medoo查询数据库

在routes/api.php写入查询路由

Route::any('/medoo', function(){
    $arr = app('medoo')->select('user','*');
    return $arr;
});

实例:medoo实现分页查询接口

public function pageApi(Request $request)
    {
        $page = $request->post('page', 1);
        $pageSize = $request->post('page_size', 10);

        $param = $request->post();

        $where = [];
        $where['is_delete'] = 0;

        if (!empty($param['username'])) {
            $where['username[~]'] = $param['username'];
        }

        if (!empty($param['status']) && in_array($param['status'], [1, 2])) {
            $where['status'] = $param['status'];
        }

        if (isset($param['admin']) && in_array($param['admin'], [0, 1])) {
            $where['admin'] = $param['admin'];
        }

        $total = $this->medoo->count('user', 'id', $where);
        if ($total == 0) {
            return ['total' => 0, 'data' => []];
        }

        $where['LIMIT'] = [($page - 1) * $pageSize, $pageSize];
        $where['ORDER'] = ['id' => 'DESC'];

        $data = $this->medoo->select('user', ['id','username', 'password', 'head_url', 'status'], $where);

        return ['total' => $total, 'data' => $data];
    }

数据库表结构

CREATE TABLE `api_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `password` varchar(50) NOT NULL,
  `head_url` char(150) NOT NULL COMMENT '头像',
  `admin` tinyint(4) NOT NULL DEFAULT '0',
  `time` int(11) unsigned NOT NULL,
  `is_delete` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '0:未删除,1:已删除',
  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '状态   1:启用, 2:禁用',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值