Laravel 8 门无法使用 Auth::guard

Laravel 8 gates not working with Auth::guard

嘿,我正在开发一个项目,我在其中拥有用户的角色和权限,我试图通过定义盖茨在中间件的帮助下保护我的路线,但它向我展示 403| Not Authorized。我不明白实际问题是什么?

进入类别控制器

public function addcategory(AdminsRole $adminsroles){

   return view('add-category');

}

进入路线

Route::get('/add-category', [CategoryController::class, 'addcategory'])->middleware('can:add-category')->name('addcategory');

进入AuthServiceProvider.php

$admin = Auth::guard('admin');

Gate::define('add-category', function ($admin, AdminsRole $adminsroles) {

    if($admin->user()->u_type != 'superadmin'){

        $adminRolescount = $adminsroles::where([
            ['admin_id', '=', $admin->user()->id],
            ['module', '=', 'categories'],
            ['add_access', '=', '1'],
        ])->count();
        return $adminRolescount;

    }else{

        return $adminRolescount = 1;

    } 

});

我认为您要查找的内容可以简化。您的控制器和路由文件中的代码不需要调整。但是,我会将您的门定义更改为以下内容:

Gate::define('add-category', function ($user = null) {
    
    // Fetch user from custom guard
    $user = Auth::guard('admin')->user();

    // Check if a valid user instance was passed
    if (is_null($user)) {
        return false;
    }

    // Allow super admins to add categories regardless of AdminsRole existence
    if ($user->u_type === 'superadmin') {
        return true;
    }

    // Check if current user has a matching AdminsRole row with add_access permission
    return AdminsRole::where([
        ['admin_id', '=', $user->id],
        ['module', '=', 'categories'],
        ['add_access', '=', '1'],
    ])->exists();

});

请注意,如果有登录用户,门总是接收用户实例作为其第一个参数,您无需自己提供。此外,您可以使用正在检查并自动提供给入口的用户实例的 ID,直接通过模型查询 AdminsRole 是否存在。