首页 > 解决方案 > Laravel 在我的路由中添加了一个额外的 can:isSuperAdmin 中间件

问题描述

    Route::group([
    'middleware' =>['JwtMiddleware', 'auth:api','can:isSuperAdmin'],
    'prefix' => '/schools'
], function () {
    Route::get('/', [SchoolController::class, 'index']);
});

我想添加一个额外的身份验证,例如只有具有 super_admin 角色的用户才能访问此端点,具有 super_admin 角色的用户的 user_id 是 1 。我怎样才能像上面一样将中间件添加到我的路线中.. 使用这个中间件的其他关系/重要代码是什么

标签: laraveleloquent

解决方案


您需要在中间件文件夹下创建一个中间件:

<?php

namespace App\Http\Middleware;

use Closure;

class EnsureUserHasRole
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // Redirect...
        }

        return $next($request);
    }

}

并将此中间件注册到您的app/Http/Kernel.php


    protected $routeMiddleware = [
        // ...
       'role' => \Illuminate\Auth\Middleware\EnsureUserHasRole::class,
    ];

您还需要hasRole()在您的用户模型中:

    public function hasRole($role)
    {
        switch ($role) {
            case 'isSuperAdmin':
                return $this->super_admin;
        }
    }

毕竟,您可以将其用作:

Route::group([
            'middleware' => ['JwtMiddleware', 'auth:api', 'role:isSuperAdmin'],
            'prefix' => '/schools'
        ], function () {
            Route::get('/', [SchoolController::class, 'index']);
        });

推荐阅读