Laravel 8 门不适用于 Auth::guard

Posted

技术标签:

【中文标题】Laravel 8 门不适用于 Auth::guard【英文标题】:Laravel 8 gates not working with 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 好的,谢谢 【参考方案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.正确,在任何时候如果返回一个真值,门将允许访问。

以上是关于Laravel 8 门不适用于 Auth::guard的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 图像规则验证不适用于 Laravel 8,但适用于 Laravel 7 |拉拉维尔 |图片 |验证

作曲家和 laravel 7 不适用于 php 8.1 [关闭]

ckeditor 5中的图像上传不适用于laravel 8

Laravel 8 迁移:DB:unprepared 不适用于共享托管服务器

PHP Imagick 不适用于 Laravel 8 中的 PDF 文件,简单的 ImagickException

带有 vue 2 组件的 vue 路由器不适用于 laravel 5.8