anik/permit

此包已被废弃,不再维护。未建议替代包。

Permit 是一个 Laravel ACL 和授权包

维护者

详细信息

github.com/ssi-anik/permit

源代码

v2.3.2 2024-04-28 13:30 UTC

README

警告

请勿使用此存储库和包。这是组织所需内容的扩展。使用父存储库或甚至不要使用它。🤷

Laravel Permit 是一个 Laravel 的授权和 ACL 包。它快速且可自定义。您可以轻松处理基于角色的 ACL 或特定用户的权限。所以,让我们从 Laravel Permit 开始一段旅程。

安装

您可以从 composer 开始。进入您的终端,并在项目根目录中运行以下命令。

composer require nahid/permit

稍等片刻,它会下载所有依赖项。

配置

完成安装后,您需要对其进行配置。首先,将这些行复制并粘贴到 config/app.php 文件中,其中 providers 数组存在。

Nahid\Permit\PermitServiceProvider::class,

并添加对 facade 的支持

'Permit'    => Nahid\Permit\Facades\Permit::class,

嗯,现在您必须运行此命令来发布必要的文件。

php artisan vendor:publish --provider=Nahid\Permit\PermitServiceProvider

然后转到 config/permit.php 并使用您的所需凭据进行编辑。

return [
    'users' => [
        'model' => \App\User::class,
        'table' => 'users',
        'role_column'   => 'type'
    ],

    'super_user'    =>  'admin',

    'abilities'   => [
       // "module"  => ['ability1', 'ability2', 'ability3'=>'policy_module.policy'],
    ],


    'policies'  => [
        /*'module' => [
            'update'    => '\App\Permit\Policies\PostPolicy@update',
        ],*/
    ],



    'roles' => [
        /*'role_name' => [
            'module.ability',
        ],*/
    ]
];

现在运行此命令进行迁移

php artisan migrate

您就快完成了,只需在您的 User 模型中添加此 trait Nahid\Permit\Users\Permitable。示例

namespace App;

use Illuminate\Database\Eloquent\Model;
use Nahid\Permit\Users\Permitable;

class User extends Model
{
    use Permitable;
}

是的,完成了。

它是如何工作的?

这是一个常见问题。但首先,您必须了解我们的数据库架构。当您运行迁移命令时,我们创建一个包含 'role_name' 和 'permission' 字段的 'permissions' 表,并在 users 表中添加两个列 'role' 和 'permissions'。 role 列存储用户角色,permissions 列存储用户特定的控制。在这里,role 列与 permissions.role_name 列及其控制相关联。permissions.permission 处理基于角色的控制。

我们以 JSON 格式存储权限,并指定特定的服务和功能。

{
    "user": {
        "create": true,
        "update": true
    },
    "post": {
        "create": false,
        "update":"\\App\\Permit\\Policies\\PostPolicy@update",
        "delete": true
    }
}

在这里,userpost 是服务/模块名称,而 createupdatedelete 或其他则是能力。

设置用户角色

语法

bool Permit::setUserRole(int $user_id, string $role_name)

示例
Permit::setUserRole(1, 'admin');

设置用户权限

语法

bool Permit::setUserPermissions(int $user_id, string $module, array $abilities)

示例
Permit::setUserPermissions(1, 'post', ['create'=>true, 'update'=>true]);

设置角色权限

语法

bool Permit::setRolePermissions(string $role_name, string $module, array $abilities)

示例
Permit::setRolePermissions('admin', 'post', ['create'=>true, 'update'=>true]);

如何授权事件?

检查用户能力

$user = User::find(1);

if (Permit::userCan($user, 'post.create')) {
    //do something
}

post.create 中有一个模块/服务的事件。在这里,post 是模块,而 create 是能力。

因此,如果用户授权了 post create 事件,则用户将通过。

Permit::userCan() 方法返回布尔值。如果您想抛出 Unauthorized 异常,可以使用

Permit::userAllows() 使用相同的参数。

检查用户角色能力

$user = User::find(1);

if (Permit::roleCan($user, 'post.create')) {
    //do something
}

在这里,当给定用户角色允许此事件时,它将通过。这里有类似的抛出异常的方法

Permit::roleAllows()

检查用户所有能力

您可以从用户或用户角色检查用户能力。在这里,我们检查(用户和角色)权限,但如果设置了用户特定权限,则其优先级最高。

$user = User::find(1);

if (Permit::can($user, 'post.create')) {
    //do something
}

这里有抛出异常的另一种方法

Permit::allows()

策略

策略是一个类似于 Laravel 本地授权的功能,但非常简单。Permit 允许您在一条线上管理 ACL 和授权。我知道您第一个问题是我们在哪里使用 Policy

让我们来看一个例子,假设你有一个用户评论系统,其中每个博客帖子下的用户评论和评论所有者都可以编辑和删除他们的评论。因此,你必须应用一个授权系统,其中用户可以修改他/她的评论。所以在这里,我们必须实现我们的自定义策略。看一下

创建策略

首先,我们需要创建一个策略类。

namespace App\Policies;

use App\Comment;
use App\User;

class CommentPolicy
{
    public function update(User $user, Comment $comment)
    {
        return $user->id == $comment->user_id;
    }
}

现在将此策略与我们的配置文件关联。转到 config/permit.php 并更新 `policies` 部分的此部分

    ,'policies'  => [
        'comment'  => [
            'update'    => '\App\Policies\CommentPolicy@update'
        ]
    ]

现在您已将此策略绑定到一个能力。假设我们有一个关于评论的模块,所以这个能力在 config/permit.phpabilities 部分看起来像这样

"comment"  => ['create', 'update'=>'comment.update', 'delete'],

这里 'update'=>'post.update',其中 "update" 是一个能力,而 "post.update" 是一个策略。这个系统将策略绑定到能力,所以现在您可以像使用一般能力一样使用此策略。

您可以在配置文件中预定义所有角色的权限。首先设置您的近似能力,然后分配能力给角色。看一下

'abilities'   => [
        "comment"  => ['create', 'update'=>'comment.update', 'delete'],
        "user"  => ['create', 'update', 'delete'],
    ],

    'roles' => [
        'admin' => [
            'post.*',
            'user.*',
        ],

        'user'    => [
            'post.create',
            'post.update',
            'user.create',
            'user.update',
        ]
    ],

    'policies'  => [
        'comment'  => [
            'update'    => '\App\Policies\CommentPolicy@update'
        ]
    ]

在这里,admin 和 user 是角色,其值是权限或能力。但是您不能使用它,因为它没有与数据库同步。所以从您的终端运行此命令

php artisan permit:sync

如何使用基于策略的能力

在前一个部分中,我们将 comment.update 策略与一个能力绑定,并且它们具有相同的名称。让我们检查当前打开的评论是否授权给已登录的用户。

$comment = Comment::find(1);
Permit::allows(auth()->user(), 'comment.update', [$comment]);

这里第一个参数是授权用户,第二个是权限,第三个是策略方法参数。我们始终自动将认证用户绑定为第一个参数,然后传递其他参数。

您可以使用其他方法,如 roleCan、'userCan'、所有辅助函数和 blade 指令,以相同的程序。

有时您必须检查给定的用户是否能够执行任何能力。所以我们使其变得简单。让我们看看

Permit::allows(auth()->user(), ['post.create', 'comment.create']);

但是,如果您的能力与策略绑定并且需要参数,那么您可以通过关联数组传递能力。

$comment = Comment::find(1);
Permit::allows(auth()->user(), ['post.create', 'comment.update'=>[$comment], 'comment.create']);

这里,如果给定的用户被分配到任何能力,则允许。

命令

我们提供了几个命令来提高用户体验

php artisan permit:sync

与数据库同步您的组合权限。

php artisan permit:add

向用户或角色添加权限

php artisan permit:remove

从用户或角色中删除权限

php artisan permit:fetch

获取用户或角色的权限

php artisan permit:role

创建新角色

辅助函数

在这里,您可以使用辅助函数而不是外观。

user_can()

您可以使用 user_can() 代替 Permit::userCan()

user_allows()

您可以使用 user_allows() 代替 Permit::userAllows()

role_can()

您可以使用 role_can() 代替 Permit::roleCan()

role_allows()

您可以使用 role_allows() 代替 Permit::roleAllows()

can_do()

您可以使用 can_do() 代替 Permit::can()

allows()

您可以使用 allows() 代替 `Permit::allows()`

Blade 指令

有时您可能希望在视图中使用这些功能。Permit 包含所有 blade 指令。

示例

@userCan($user, 'post:create')
    <a href="#">Link</a>
@endUserCan

您还可以使用 else 指令

@userCan($user, 'post:create')
    <a href="#">Link</a>
@elseDo
    <a href="#">Link 2</a>
@endUserCan

指令列表

  • @userCan()
  • @elseUserCan
  • @endUserCan()
  • @roleCan()
  • @elseRoleCan
  • @endRoleCan()
  • @allows()
  • @endAllows()
  • @elseAllows()

如果您有任何类型的查询,请随时与我分享

谢谢