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 );
}
}
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表
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 3年前 自动加精
好!!!!!!
这个
vip
中间件不报错吗?难道不是auth.api
?我想提出个问题,会员管理界面用的是vue-element-admin登陆了,那在web路由中怎么获取到会员登陆者的信息
所以,这不应该是
jwt.auth
中间件的缺陷吗?我前几天搞多表验证也遇到这个问题,后来直接换成官方的auth:api
了,中间找到了两三种处理这个问题的办法,但是发现这个中间键并不是不可替代的就放弃了它。你这个思路很不错,下次再搞的时候我也这么玩一下 :+1:那如果,你user和vip守卫都同时登录,那请问你vip守卫获取的登录用户信息会不会变成user用户了 ?
我用的laravel8,贴下代码,你看下我的没更换掉
注册的中间件
定义的守卫
路由使用
输出结果,当使用member切换时
发现并没有切换过来,是什么原因呢?
啊啊啊啊啊,怎么回事吖 :tired_face:
@php_yt 我来给咱测试一波看好了
我使用的地方
这个中间件注册的地方
在memberAuth 打印 config(‘auth.defaults.guard’) 和$this->auth->getDefaultDriver() 看是否改变
这个auth函数有毒
我看了下源码,这样改了
完美!!!好开心啊啊,哈哈哈