前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >laravel 自定义中间件实现身份验证

laravel 自定义中间件实现身份验证

作者头像
崔哥
发布2023-04-16 16:28:17
1.7K0
发布2023-04-16 16:28:17
举报
文章被收录于专栏:崔哥的专栏

通过Laravel 用户认证我们知道了基于 api 的身份验证,实现方式有Laravel Sanctum API 授权Laravel 使用 Json Web Token(JWT) 等,今天介绍一下自定义中间件实现身份验证

中间件

使用中间件需要提前在app/Http/Kernel.php这里配置,分为全局中间件、中间件、中间件组

全局中间件

全局中间件无需主动调用,系统会自动应用到每次请求。比如:TrimStrings中间件会自动去掉请求参数左右两边的空格;ConvertEmptyStringsToNull中间件会自动把请求参数中的空字符串转为 null。

ConvertEmptyStringsToNull中间件建议不要开启,空字符串和 null 类型不同要区分开。我们之前就遇到一个坑:一个支持关键词搜索的列表,参数校验为'keyword' => 'string',,因为启用了该中间件,传空字符串时报错了,The keyword must be a string

按照我们通常理解关键词可以传(string),也可以不传(null);这里可以传又分为空字符串和有值的字符串

  • 不启用该中间件,传空字符串:参数校验'keyword' => 'string',,通过参数校验,我拿到空字符串。。。
  • 启用该中间件,传空字符串:参数校验'keyword' => 'string|nullable',,通过参数校验,我拿到null值。。。

最终我选择不启用该中间件

中间件、中间件组

一、上面提到的Laravel Sanctum API 授权使用的是auth中间件

代码语言:javascript
复制
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
    ...
    ];

//比如
Route::group(['middleware' => ['auth:sanctum']], function () {}

但在SPA 认证场景下也会使用api中间件组

代码语言:javascript
复制
    protected $middlewareGroups = [
    ...
        'api' => [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    ...
        ],
    ];

二、JWT使用的也是auth中间件

代码语言:javascript
复制
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
    ];

//比如
$this->middleware('auth:api', ['except' => ['login']]);

自定义中间件

该中间件支持多端,比如用户端和管理员端

vi app/Http/Middleware/ApiAuth.php

代码语言:javascript
复制
<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Redis;

class ApiAuth {
    public $key='{role}.{id}.token';
    /**
     * api鉴权中间件
     * @param $request
     * @param Closure $next
     * @param $role
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response|mixed
     */
    public function handle($request, Closure $next, $role) {//$role=user/admin
        $token=$request->header('token', '');
        if(empty($token)){
            return response(['msg'=>'未传递token,请重新登录'], 403);
        }

        $_token=Redis::get(str_replace(['{role}', '{id}'], [$role, $request->route($role.'_id')], $this->key));

        if (empty($_token)) {
            return response(['msg'=>'token已失效,请重新登录'], 401);
        }

        if($token !==$_token){
            return response(['msg'=>'未通过验证,请重新登录'], 401);
        }
        return $next($request);
    }
}

app/Http/Kernel.php配置一下

代码语言:javascript
复制
    protected $routeMiddleware = [
    ...
        'auth.api' => \App\Http\Middleware\ApiAuth::class,
    ];

在路由中使用

代码语言:javascript
复制
#用户端
Route::group(['prefix' => 'user', 'middleware'=>['auth.api:user']], function(){}

#管理员端
Route::group(['prefix' => 'admin', 'middleware'=>['auth.api:admin']], function(){}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 中间件
    • 全局中间件
      • 中间件、中间件组
      • 自定义中间件
      相关产品与服务
      消息队列 TDMQ
      消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档