通过路由中间件JWT多表认证

Deep
  1. composer require tinywan/jwt

  2. 用户端路由使用jwt中间件
    Route::get('/profile', \app\api\user\controller\UserController::class . '@profile')->middleware([
    \app\middleware\JwtUser::class
    ]);

  3. 管理员后台路由使用jwt中间件
    Route::get('/profile', \app\api\admin\controller\UserController::class . '@profile')->middleware([
    \app\middleware\JwtAdmin::class
    ]);

JwtUser.php

<?php

namespace app\middleware;

use app\model\User;
use Exception;
use Illuminate\Support\Arr;
use Tinywan\Jwt\Token;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;

class JwtUser implements MiddlewareInterface
{
    /**
     * @throws Exception
     */
    public function process(Request $request, callable $handler): Response
    {
        try {
            Token::getUser();
        } catch (Exception $e) {
            return response('unauthorized', 401);
        }

        $user = Token::getExtend();

        if (Arr::get($user, 'role') !== 'user') {
            return response('unauthorized', 401);
        }

        return $handler($request);
    }
}

JwtAdmin.php

<?php

namespace app\middleware;

use Exception;
use Illuminate\Support\Arr;
use Tinywan\Jwt\Token;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;

class JwtAdmin implements MiddlewareInterface
{
    public function process(Request $request, callable $handler): Response
    {
        try {
            Token::getUser();
        } catch (Exception $e) {
            return response('unauthorized', 401);
        }

        $admin = Token::getExtend();

        if (Arr::get($admin, 'role') !== 'admin') {
            return response('unauthorized', 401);
        }

        return $handler($request);
    }
}

用户控制器
\app\api\user\controller\UserController::class
login方法中

$user = User::query()->find(1);

$user = $user->toArray();

$user['uid'] = $user['id'];
$user['id'] = 'user:' . $user['id'];
$user['role'] = 'user';

Token::generateToken($user);

管理员控制器
\app\api\admin\controller\UserController::class
login方法中

$admin = Admin::query()->find(1);

$admin = $admin->toArray();

$admin['uid'] = $admin['id'];
$admin['id'] = 'admin:' . $admin['id'];
$admin['role'] = 'admin';

Token::generateToken($admin);

修改配置文件
/config/plugin/tinywan/jwt/app.php 配置文件中 is_single_device = true

退出登录
Token:clear()

116 0 0
0个评论

Deep

220
积分
0
获赞数
0
粉丝数
6天前 加入
×
🔝