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 有两种类型的管理员 Superadmin
和 Subadmin
对于超级管理员我想给他们所有访问权限,但对于子管理员他们需要通过门中定义的逻辑。跨度>
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 [关闭]
Laravel 8 迁移:DB:unprepared 不适用于共享托管服务器