首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel权限用法

Laravel权限用法
EN

Stack Overflow用户
提问于 2021-09-30 09:17:33
回答 1查看 83关注 0票数 0

我正在设计一个web应用,其中有几个用户角色和权限,所以我尝试了laravel-permission,它看起来很棒,我可以根据指南创建角色和权限。

我创建了用户角色:超级管理员、管理员、办公室管理员、检查员、用户。

超级管理员可以授予管理员角色,

admin可以授予office-admin角色和

office-admin可以授予检查员角色。

我创建了grant-user权限和UserPolicy,其中包含如下所示的grant()方法。

代码语言:javascript
复制
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。所以我想我做错了什么。在这种情况下,权限表的用途是什么?要正确使用它,应该做哪些更改?

EN

回答 1

Stack Overflow用户

发布于 2021-09-30 10:18:03

在该方法中编写访问检查的方式是完全正确的。你的问题似乎更多的是关于理解权限是如何工作的。我将在下面解释它。

在理想的应用程序中,您不需要对角色进行硬编码。相反,权限是硬编码的。Laravel权限包也推荐这是一种最佳实践:https://spatie.be/docs/laravel-permission/v5/best-practices/roles-vs-permissions

因此,您可以使用以下两种方法之一来检查代码中的权限:

  1. auth()->user()->can('edit answers')
  2. @can('edit answers') -刀片指令

这里的权限是edit answers。如果您的用户分配了直接权限,或者分配给该用户的某个角色具有此权限,则上述语句将返回true

实体是通过以下方式连接的:

  1. User -> has roles
  2. Role -> has permissions

我将解释laravel-permission包中的表:

  1. model_has_roles -定义用户和roles.
  2. role_has_permissions之间的映射-定义角色和permissiones.
  3. model_has_permissions之间的映射-定义用户和权限之间的直接映射。我个人避免这样做,因为很难为每个用户维护权限。

因此,在您的策略文件中,将按如下方式检查权限grant-user

代码语言:javascript
复制
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管理员不能再授予用户权限,则无需更新代码。您只需从数据库中删除权限映射即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69389553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档