【问题标题】:Implementation of the authorization system, in which each individual specific permission gives access to a specific column in Laravel授权系统的实现,其中每个单独的特定权限都可以访问 Laravel 中的特定列
【发布时间】:2019-08-23 04:22:54
【问题描述】:

我正在创建 API,让用户从数据库中读取一些数据,但我想拒绝访问我表中的某些列。

例如有权限users.show.name_of_example_column,应该访问users表中的name_of_example_column列。

Spatie/Laravel-Permission 负责将用户与我的 API 中的权限和角色相关联。

我系统中的用户有 2 个权限:

  • users.show.id

  • users.show.name

管理员拥有所有权限。

我已经做了一个例子来告诉你我想要什么结果(取决于我的角色)。

public function index($perPage = 30)
{
   $user = Auth::User();
   $fields = [];
   if($user->hasPermissionTo('users.show.id')) {
       $fields[] = 'id';
   }
   if($user->hasPermissionTo('users.show.name')) {
       $fields[] = 'name';
   }
   if($user->hasPermissionTo('users.show.email')) {
       $fields[] = 'email';
   }
   return User::Select($fields)->paginate($perPage);
}

当然,这个例子是不好的做法。我应该通过访问器或其他地方在用户模型中执行此操作吗?正确的方法是什么?有什么想法吗?

更新

我试图检查访问者的权限

这里是例子

public function getEmailAttribute($value)
{
   if(Auth::User()->hasPermissionTo('users.show.email')) {
     return $value;
   }
   return false;
}

但当它返回false 时,它不会从集合中取消设置(删除)“电子邮件”属性。它只是将原始值替换为“false”。

【问题讨论】:

  • 使用访问器/修改器似乎是一个更好的选择。
  • 非常感谢。这就是我需要的。
  • 请看我的更新。我对访问器有一个问题。
  • 抱歉回复晚了,看看下面的帖子是否有帮助

标签: php laravel api permissions


【解决方案1】:

访问器不能用于隐藏模型属性,您需要将这些选择属性标记为隐藏 l

所以在你的模型中添加一个通用方法,它将根据权限级别为你隐藏

public function marker()
{

    // loop over the attributes 

    // check permission for $attr - email

    if($hasPermissionForEmail)
    {
        // do nothing
    }
    else
    {
        $this->makeHidden('email');
    }

}

现在

$a->marker();

注意:当您直接访问像 $a->email 这样的属性时,它似乎不起作用,但是当对象作为 json 或数组在响应中发送时,它会起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多