laravel 11 Sanctum 多用户授权问题

已完美撒花解决,多亏了老兄的提醒,我自己的问题是 apifox 没有单独配置第二套用户的请求头导致程序识别不到用户信息

  1. auth.php 配置文件不需要额外配置

  2. 创建 「token」 时区分权限(第二个参数)

  3. 创建中间件去验证创建 「token」 时分配的权限,参考文档:Sanctum API 授权

    // 大致内容
    public function handle(Request $request, Closure $next): Response
    {
       if ($request->user()->tokenCan('user')) {
           return $next($request);
       }
    
       throw new \Illuminate\Auth\AuthenticationException();
    }
  4. bootstrap/app.php 为中间件分配别名

    withMiddleware(function (Middleware $middleware) {
     $middleware->alias([
         'check.type.user' => CheckUserToken::class,
         'check.type.admin' => CheckAdminToken::class,
     ]);
    })
  5. 路由绑定中间件

    /** user */
    Route::group([
     'prefix' => 'client',
     'middleware' => [
         'auth:sanctum',
         'check.type.user'
     ]
    ], function () {
     Route::prefix('auth')->group(function () {
         Route::post('login', [UserAuthController::class, 'login'])->withoutMiddleware(['auth:sanctum', 'check.type.user']);
         Route::post('logout', [UserAuthController::class, 'logout']);
     });
    });
    /** admin */
    Route::group([
     'prefix' => 'admin',
     'middleware' => [
         'auth:sanctum',
         'check.type.admin',
     ]
    ], function () {
     Route::prefix('auth')->group(function () {
         Route::post('login', [AdminAuthController::class, 'login'])->withoutMiddleware(['auth:sanctum', 'check.type.admin']);
         Route::post('logout', [AdminAuthController::class, 'logout']);
     });
    });

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
sanders
最佳答案

auth 中间件后面的参数是 guard 。

我没太懂,楼主是想同时让 admin 和 user 登录吗?如果是,前端应该区分令牌存储位置,访问不同的位置传给服务器的 请求头采用不同的 token 。

去掉 auth 中间件肯定不能从令牌识别出用户,这点是没理解楼主想要实现什么效果。

5个月前 评论
肌无力猛男 (楼主) 5个月前
sanders (作者) 5个月前
肌无力猛男 (楼主) 5个月前
讨论数量: 13
/** @var Route $router */
Route::group(['middleware' =>['auth:sanctum', 'auth_admin']], function () use ($router) {

    $router->get('profile', [AuthController::class, 'profile']);
    $router->post('sign-out', [AuthController::class, 'signOut']);
});
/** @var Route $router */
Route::group(['middleware' =>['auth:sanctum', 'auth_user']], function () use ($router) {

    $router->get('profile', [AuthController::class, 'profile']);
    $router->post('sign-out', [AuthController::class, 'signOut']);
});

admin.php 与user.php 我都是这样用的 这样有问题吗?

5个月前 评论
肌无力猛男 (楼主) 5个月前
人称外号大脸猫 (作者) 5个月前
肌无力猛男 (楼主) 5个月前
Cooper

不需要 配置 auth.php

// user.auth 为自己实现的中间件
$router->middleware(['auth:sanctum', 'user.auth'])->group(function (Router $router) {});

// 自己实现中间件 
public function handle(Request $request, Closure $next)
{
        if (auth()->user()->tokenCan('user')) {
            return $next($request);
        }

        throw new ApiForbiddenException;
}
5个月前 评论
肌无力猛男 (楼主) 5个月前
肌无力猛男 (楼主) 5个月前
sanders

auth 中间件后面的参数是 guard 。

我没太懂,楼主是想同时让 admin 和 user 登录吗?如果是,前端应该区分令牌存储位置,访问不同的位置传给服务器的 请求头采用不同的 token 。

去掉 auth 中间件肯定不能从令牌识别出用户,这点是没理解楼主想要实现什么效果。

5个月前 评论
肌无力猛男 (楼主) 5个月前
sanders (作者) 5个月前
肌无力猛男 (楼主) 5个月前
5个月前 评论
肌无力猛男 (楼主) 5个月前

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