Jwt-auth 多表验证

使用 jwt 有时需要两个表的权限认证,users表和vips表。

配置多个 guard

config/auth.php

'defaults' => [
    'guard'     => 'user', //默认guard
    'passwords' => 'users',
],
'guards' => [
    'user'   => [ //jwt guard 1
        'driver'   => 'jwt',
        'provider' => 'users',
    ],
    'vip'   => [ //jwt guard 2
        'driver'   => 'jwt',
        'provider' => 'vips',
    ],
],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model'  => App\Model\User::class,
    ],
    'vips' => [
        'driver' => 'eloquent',
        'model'  => App\Model\Vip::class,
    ],
],

创建更改默认 guard 的中间件

<?php
namespace App\Http\Middleware;
use Closure;
class SetDefaultGuard
{
    public function handle($request, Closure $next, $guard)
    {
        config(['auth.defaults.guard'=>$guard]);
        return $next($request);
    }
}

添加中间件

Http/Kernel.php

protected $middlewareGroups = [
    'web' => [
        ...
    ],
    'user' => [
        'throttle:60,1',
        'bindings',
    ],
    'vip' => [
        'throttle:60,1',
        'bindings',
        'auth.vip'
    ],
];
protected $routeMiddleware = [
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'setguard'  => \App\Http\Middleware\SetDefaultGuard::class, // 这里
    'auth.user' => \App\Http\Middleware\UserAuth::class, // 权限认证中间件1
    'auth.vip' => \App\Http\Middleware\VipAuth::class,// 权限认证中间件2

    // 'auth'     => \Illuminate\Auth\Middleware\Authenticate::class,
    //'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    //'can'      => \Illuminate\Auth\Middleware\Authorize::class,
    //'guest'       => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

在权限认证中间件之前使用这个中间件

App\Providers\RouteServiceProvider

public function map()
{
    $this->mapUserRoutes(); //1
    $this->mapVipRoutes(); //2
    $this->mapAdminRoutes();
    $this->mapWebRoutes();
}
...
protected function mapVipRoutes()
{
    // 在权限认证中间件之前,使用这个中间件
    Route::middleware(['setguard:vip','vip'])->prefix('vip')->namespace($this->namespace . '\Vip\\')->group(base_path('routes/vip.php'));
}

测试

这时在两个不同的权限认证中间件中打印 auth()

user

<?php
namespace App\Http\Middleware;
...
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
class UserAuth extends BaseMiddleware
{
    public function handle($request, Closure $next)
    {
        dd( auth() ); //这里是默认 guard
        dd( $this->auth );
    }
}

Jwt-auth 多表验证

vip

<?php
namespace App\Http\Middleware;
...
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
class VipAuth extends BaseMiddleware
{
    public function handle($request, Closure $next)
    {
        dd( auth() ); //验证这里是否更改了默认guard
        dd( $this->auth );// JWTAuth对象已切换到 vip guard 读取的是vips表
    }
}

Jwt-auth 多表验证

本作品采用《CC 协议》,转载必须注明作者和本文链接
welcome come back
本帖由系统于 2年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 20

我看了下源码,这样改了

file

file

file

Laravel

Laravel

Laravel

完美!!!好开心啊啊,哈哈哈

2年前 评论

好!!!!!!

3年前 评论
protected function mapVipRoutes()
{
    // 在权限认证中间件之前,使用这个中间件
    Route::middleware(['setguard:vip','vip'])->prefix('vip')->namespace($this->namespace . '\Vip\\')->group(base_path('routes/vip.php'));
}

这个vip中间件不报错吗?难道不是auth.api?

3年前 评论
php_yt (楼主) 3年前
Reason_bobo (作者) 3年前
php_yt (楼主) 2年前

我想提出个问题,会员管理界面用的是vue-element-admin登陆了,那在web路由中怎么获取到会员登陆者的信息

3年前 评论

所以,这不应该是 jwt.auth 中间件的缺陷吗?我前几天搞多表验证也遇到这个问题,后来直接换成官方的 auth:api 了,中间找到了两三种处理这个问题的办法,但是发现这个中间键并不是不可替代的就放弃了它。你这个思路很不错,下次再搞的时候我也这么玩一下 :+1:

3年前 评论

那如果,你user和vip守卫都同时登录,那请问你vip守卫获取的登录用户信息会不会变成user用户了 ?

2年前 评论
php_yt (楼主) 2年前
xiayimiaozhongjianni (作者) 2年前
xiayimiaozhongjianni (作者) 2年前
php_yt (楼主) 2年前
php_yt (楼主) 2年前

我用的laravel8,贴下代码,你看下我的没更换掉


注册的中间件

file修改默认Guard中间件

file

定义的守卫

file

file

路由使用

file

输出结果,当使用member切换时

file

发现并没有切换过来,是什么原因呢?

2年前 评论
php_yt (楼主) 2年前

file

file

file

啊啊啊啊啊,怎么回事吖 :tired_face:

2年前 评论
晏南风 (作者) 2年前
php_yt (楼主) 2年前

@php_yt 我来给咱测试一波看好了

我使用的地方

file

这个中间件注册的地方

file

在memberAuth 打印 config(‘auth.defaults.guard’) 和$this->auth->getDefaultDriver() 看是否改变

Laravel

Laravel

这个auth函数有毒 :weary:

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
94
粉丝
24
喜欢
156
收藏
346
排名:325
访问:2.9 万
私信
所有博文
社区赞助商