【问题标题】:Laravel - How to CRUD records with ownership?Laravel - 如何对所有权进行 CRUD 记录?
【发布时间】:2017-06-07 17:07:25
【问题描述】:

假设我有多个用户 - 管理员、经理、用户。用户可以对他拥有的记录进行 CRUD。经理可以对他和他的用户拥有的记录进行 CRUD。管理员可以对所有记录进行 CRUD。如何在 Laravel 中实现这一点?

【问题讨论】:

  • 使用他们的角色和他们想要编辑的用户角色
  • 任何示例代码?
  • 您有用户层次结构和他们的访问级别。给出示例代码是一个广泛的事情
  • User1 有 Record1 和 Record2,而 User2 有 Record3 和 Record4。 User1 只能访问他的记录,而 Manager 可以访问 User1 和 User2 的记录,对于 Admin 也是如此。如何在 Laravel 代码中复制它?
  • 你可以定义一个单独的角色表,带有id和name。其中包含 1 管理员、2 经理、3 用户等记录。然后在用户表中添加名为 role_id 的列作为角色表的外键。在此之后,您只需检查当前用户的角色和要编辑其详细信息的用户的角色。

标签: php laravel


【解决方案1】:

如果您只有一个角色,请使用中间件。

如果你有多个角色,就像你说的那样,你已经使用了 Laravel 提供的开箱即用的门/策略。

为了处理管理员,您将在过滤器之前使用

public function before($user, $ability)
{
    return ($user->is_admin) ? true : null; //return null so we continue authorising further
}

处理经理 ||用户你会使用这些方面的东西(最棘手的一个):

public someCRUDaction(User $current, Item $item) {
    return $item->created_by == $current->id || $current->users->contains('id', $item->created_by); // you need to handle logic if item belongs to manager
}

注意$item->created_by == $current->id 是不言自明的,如果当前用户是项目的所有者,则处理


如何使用政策(我会选择政策)和门:

https://laravel.com/docs/5.4/authorization#writing-policies

请记住,您不想验证任何内容,只需 $current 用户执行操作 X 即可?

使用策略,您需要检查用户是否可以执行操作 X 至少两次(在视图和控制器/路由/自定义表单请求中 - 您处理验证的地方)。

【讨论】:

    【解决方案2】:

    您可以创建一个中间件来验证当前用户的角色和所选用户的角色以执行操作。

    【讨论】:

      猜你喜欢
      • 2018-07-18
      • 2020-11-23
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 2023-03-19
      • 2023-02-22
      • 2017-05-12
      相关资源
      最近更新 更多