tymon jwt 多表认证

laravel版本7.x
“tymon/jwt-auth”: “^1.0”
根据论坛里面https://learnku.com/articles/28881步骤操作
多表认证提示user not found。

auth.php 配置
'guards' => [
  'web' => [
  'driver' => 'session',
  'provider' => 'users',
  ],

  'api' => [
  'driver' => 'token',
  'provider' => 'users',
  'hash' => false,
  ],
  'member' => [
  'driver' => 'jwt',
  'provider' => 'members'
  ],
],
'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model'  => App\User::class,
        ],
        'members' => [
            'driver' => 'eloquent',
            'model'  => App\Models\Member::class,
        ],
        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

路由文件

Route::group(['middleware' => ['jwt.role:member', 'jwt.auth']], function () {
        Route::post('me', 'MemberController@info');
    });

jwt.role中间件是为了区分role为user还是member,代码如下:

public function handle($request, Closure $next, $role = null)
    {
        try {
            // 解析token角色
            $token_role = $this->auth->parseToken()->getClaim('role');
        } catch (JWTException $e) {
            /**
             * token解析失败,说明请求中没有可用的token。
             * 为了可以全局使用(不需要token的请求也可通过),这里让请求继续。
             * 因为这个中间件的责职只是校验token里的角色。
             */
            return $next($request);
        }
        if ($token_role != $role) {
            throw new UnauthorizedHttpException('jwt-auth', ApiCode::INVALID_JWT[1]);
        }

        return $next($request);
    }

查询到返回user not found的原因为:
使用members表中i为1的用户数据正常登陆后能返回token值,然后使用此token值返回/admin/me路由(添加了jwt-auth中间件),在user表中如果存在id为1的数据,则验证能通过,并且能获取到member表中id为1的用户数据。
但是如果删除了user表中id为1的数据,jwt-auth这个中间件验证就捕获通过返回user not found。
虽然jwt.role这个中间件能区分不同guard,但是jwt-auth还是使用默认的guard认证的,请问能有什么办法可以让jwt-auth中间件按照自己想使用的guard进行认证。
第一次提问,请多谅解

jwt
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3

api的driver换成jwt试一下

4年前 评论
    // 修改代码 
    Route::group(['middleware' => ['jwt.role:member', 'jwt.auth']], function () {
        Route::post('me', 'MemberController@info');
    });

//member 就是你config/auth.php 里面的guards里面的守卫名称,不同的路由使用不同的守卫的话,用auth:xxx 即可 ,这样的话,你jwt.role 中间件就可以干掉了
    Route::group(['middleware' => [ 'auth:member']], function () { 
        Route::post('me', 'MemberController@info');
    });
这样应该是能解决你的问题
4年前 评论

加一个auth()->shouldUse($guard);,您这里就是

auth()->shouldUse($role);
$token_role = $this->auth->parseToken()->getClaim('role');
1年前 评论

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