想请教如何判断资源是否属于用户的

1. 运行环境

1). 当前使用的 Laravel 版本?

[//]: Laravel 9

2). 当前使用的 php/php-fpm 版本?

PHP 版本:8.1

在写项目时遇到判断此资源是否属于用户的问题,比如

if ($host->user_id !== auth('sanctum')->id()) {
  return $this->error('无权查看');
}

我一般将以上代码放在需要的控制器中。
但是有些时候修改时可能不太方便,想请问大家有没有更加优雅的方法来判断资源是否属于用户。

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

抱歉呀,这个问题没有最佳答案,故将此回复设置为最佳答案,给大家快捷参考一下。

根据大家的回复,我选择了两个。

一个是 Laravel 官方推荐的用户策略

用户授权《Laravel 9 中文文档》

一个是来自 raybon 的依赖于 laravel-permission 基础上封装了一层权限处理方式

回复在这里

结论: 可以根据自己的需求选择适合的方式。

1年前 评论
讨论数量: 7

laravel permission看一下,虽然我没怎么用

1年前 评论

我是依赖于 laravel-permission 基础上封装了一层权限处理方式

public function destroy(User $user)
{
     \throw_can(UserPermission::delete());
}

UserPermission 文件

<?php

namespace App\Permissions;

/**
 * @method static bool root()
 * @method static bool create()
 * @method static bool edit()
 * @method static bool delete()
 * @method static bool possessed()
 * @method static bool resetPassword()
 */
class UserPermission extends BasePermission
{
    //system.user => 用户列表
    //system.user.create => 用户新增
    //system.user.edit => 用户编辑
    //system.user.delete => 用户删除
    //system.user.possessed => 用户附身
    //system.user.reset-password => 重置密码

    public static function getParentPermission()
    {
        return 'system'; // TODO: Change the autogenerated stub
    }
}

按照楼主的方式:

  1. 如果是少量的资源需要依赖于用户,建议考虑全局作用域 Global Scope
  2. 如果是全局少量引用模型 比如Host 模型, 全局都要用, 按照面向对象方式定义也可以
    public function isOwner()
    {
       return $this->user_id === option(auth('sanctum'))->id()
    }
  3. 权限分为操作权限 和数据权限 : 操作权限可以按照上面去操作, 数据权限 一般采用全局作用域或者 面向对象方式定义,提供单一入口,单一出口 ,这样后期不会修改起来很难找

以上可以参考,这样如果逻辑调整,全局也好找,尽量采用面向对象放肆,让调用成链式

1年前 评论
raybon (作者) 1年前
iVampireSP (楼主) 1年前

抱歉呀,这个问题没有最佳答案,故将此回复设置为最佳答案,给大家快捷参考一下。

根据大家的回复,我选择了两个。

一个是 Laravel 官方推荐的用户策略

用户授权《Laravel 9 中文文档》

一个是来自 raybon 的依赖于 laravel-permission 基础上封装了一层权限处理方式

回复在这里

结论: 可以根据自己的需求选择适合的方式。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!