【问题标题】:Laravel 8 gates not working with Auth::guardLaravel 8 门不适用于 Auth::guard
【发布时间】:2021-10-24 09:52:47
【问题描述】:

嘿,我正在开发一个项目,我在其中拥有用户角色和权限,我试图通过定义 Gates 在中间件的帮助下保护我的路线,但它向我展示了 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;

    } 

});

【问题讨论】:

  • 您的意思是返回adminRolesCount == 1?编辑:等等 - 你为什么还要设置 $adminRolescount?为什么要返回计数?我很困惑:D
  • @Frank 不,它没有像我预期的那样工作,所以我用adminRolesCount == 1 进行了测试,它也不起作用
  • @Frank 有两种类型的管理员 SuperadminSubadmin 对于超级管理员我想给他们所有访问权限,但对于子管理员他们需要通过门中定义的逻辑。跨度>
  • AdminsRole $adminsroles 是如何传递给 gates 函数的?甚至进入添加类别?我没有看到它在路线中定义。另外 - 确保返回布尔值,而不是计数,只检查是否存在或最后为非超级管理员返回 $adminRolescount > 0 并为超级管理员返回 true。我不太喜欢盖茨,所以其他人可能会在这里提供更好的帮助
  • @Frank 好的,谢谢

标签: php laravel permissions roles


【解决方案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();

});

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

【讨论】:

  • 嘿,我没有使用用户表,我有一个单独的用户表,即管理表。如果return AdminsRole::where([ ['admin_id', '=', $user->id], ['module', '=', 'categories'], ['add_access', '=', '1'], ])->exists(); 这意味着如果存在将返回true,我的中间件将允许我正确进入页面。
  • 如果用户不是子管理员,即超级管理员,则为 true,这意味着如果为 true,我的中间件将允许我正确进入页面。并且我们可以在门中编写多个返回真实条件吗?可以吗?
  • 您能否使用有关此管理表如何连接到您的登录/身份验证的信息来更新您的问题?同样是的,exists() 方法将返回一个布尔值,该值是真还是假,具体取决于它完成的查询。如果是真的,您的中间件确实会允许该用户查看该页面。我将用一些 cmets 更新我的答案以澄清。
  • 我只是没有使用 laravel 提供的默认身份验证,我为我创建了一个保护 admin,我使用的是 laravel 文档中提供的默认登录过程,只是没有使用用户表 i已经创建了一个名为 admins 表的单独表,与 users 表非常相似,我这样做是因为我需要为客户使用 users 表。
  • 1.这是可能的,早期返回语句(我在这里使用)是清理逻辑的好方法,而不是有几个 if else 块。 2.正确,在任何时候如果返回一个真值,门将允许访问。
猜你喜欢
  • 2019-07-05
  • 2016-09-07
  • 2016-07-30
  • 2021-06-11
  • 2017-01-06
  • 2019-07-16
  • 2019-10-01
  • 2019-10-13
  • 2022-01-26
相关资源
最近更新 更多