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',
    ],
];
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 协议》,转载必须注明作者和本文链接
focus
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 4

好!!!!!!

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

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

4个月前 评论
php_yt (楼主) 4个月前
Reason_bobo (作者) 4个月前

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

2个月前 评论

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

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!