我正在设计一个web应用,其中有几个用户角色和权限,所以我尝试了laravel-permission,它看起来很棒,我可以根据指南创建角色和权限。
我创建了用户角色:超级管理员、管理员、办公室管理员、检查员、用户。
超级管理员可以授予管理员角色,
admin可以授予office-admin角色和
office-admin可以授予检查员角色。
我创建了grant-user权限和UserPolicy,其中包含如下所示的grant()方法。
public function grant(User $user, User $model, string $role)
{
// super-admin can grant admin
if ($user->isSuperAdmin() && $role === User::ADMIN) {
return true;
}
// admin can grant office-admin
if ($user->isAdmin() && $role === User::OFFICE_ADMIN) {
return true;
}
// office-admin can grant inspector in the office
if (
$user->isOfficeAdmin() && $role === User::INSPECTOR &&
$user->office->id === $model->office->id
) {
return true;
}
}但是我根本不使用permissions表,只使用roles和UserPolicy。所以我想我做错了什么。在这种情况下,权限表的用途是什么?要正确使用它,应该做哪些更改?
发布于 2021-09-30 10:18:03
在该方法中编写访问检查的方式是完全正确的。你的问题似乎更多的是关于理解权限是如何工作的。我将在下面解释它。
在理想的应用程序中,您不需要对角色进行硬编码。相反,权限是硬编码的。Laravel权限包也推荐这是一种最佳实践:https://spatie.be/docs/laravel-permission/v5/best-practices/roles-vs-permissions
因此,您可以使用以下两种方法之一来检查代码中的权限:
auth()->user()->can('edit answers')@can('edit answers') -刀片指令这里的权限是edit answers。如果您的用户分配了直接权限,或者分配给该用户的某个角色具有此权限,则上述语句将返回true。
实体是通过以下方式连接的:
我将解释laravel-permission包中的表:
model_has_roles -定义用户和roles.role_has_permissions之间的映射-定义角色和permissiones.model_has_permissions之间的映射-定义用户和权限之间的直接映射。我个人避免这样做,因为很难为每个用户维护权限。因此,在您的策略文件中,将按如下方式检查权限grant-user:
public function grant(User $user, User $model, string $role)
{
// checks if user has direct permission mapped
// or any role assigned to the user has permission mapped
return $user->can('grant-user');
}这样做的主要优点是,您可以创建和删除任意数量的角色,并为其分配任何权限。如果您决定office管理员不能再授予用户权限,则无需更新代码。您只需从数据库中删除权限映射即可。
https://stackoverflow.com/questions/69389553
复制相似问题