dmox/h-rbac

基于原生Laravel的功能。具有回调的层次RBAC。

v0.3.1.1 2017-04-01 12:14 UTC

This package is not auto-updated.

Last update: 2024-09-20 19:37:59 UTC


README

基于原生Laravel 5的功能。具有回调的层次RBAC。

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

在创建自己的项目过程中,我形成了一个关于RBAC所需最小能力的观点。它应该允许

  • 角色和权限
  • 权限的回调(用于在权限检查中传递参数)
  • 权限的继承
  • RBAC提供服务的方式

安装

请注意,它仅适用于Laravel 5.1及更高版本。

通过Composer

$ composer require dlnsk/h-rbac

将服务提供者添加到 config/app.php

Dlnsk\HierarchicalRBAC\HRBACServiceProvider::class,

发布一些有趣的内容

  • 配置文件(config/h-rbac.php)
  • 迁移(向users表添加role字段)
  • 角色/权限/回调配置类(app/Classes/Authorization/AuthorizationClass.php)

使用

php artisan vendor:publish --provider="Dlnsk\HierarchicalRBAC\HRBACServiceProvider"

添加您需要的角色、权限以及需要的地方的回调,享受乐趣!

概述

此模块是Laravel 5.1及更高版本的授权逻辑的包装器,用于控制对资源访问。除了您不应该定义能力,它们将自动定义。

让我们描述一下RBAC所需的最小能力(据我所知)。

角色和权限

很明显。

权限的回调

一个非常常见的情况是允许用户仅更改自己的帖子。使用这个包很简单

public function editOwnPost($user, $post) {
	return $user->id === $post->user_id;
}

并且使用

if (\Gate::can('editOwnPost', $post)) {
}

您可以在回调中传递任意数量的参数作为数组。

权限的继承

如您所见,回调非常有用。但网站管理员可以编辑任何帖子怎么办?创建单独的权限?但我们应该检查哪一个呢?

答案是使用链式(继承)权限。例如

editPost -> editPostInCategory -> editOwnPost

将这些权限中的每一个放入适当的角色中,但我们始终检查第一个(除非在非常罕见的情况下)

if (\Gate::can('editPost', $post)) {
}

这些权限将逐一检查,直到其中一个通过。否则,将拒绝用户的权限。因此,我们有许多具有不同业务逻辑的权限,但在代码中只需检查一个。

RBAC提供的方式

非常流行的是使用数据库存储角色和权限。它很灵活,但很难支持。角色和权限的管理需要后端(但仍可以直接在DB中更改)。当我们开始使用权限的继承时,直接更改变得过于困难。

在另一方面,大多数项目都不大。它们只需要少量角色和权限,因此后端变得经济上不划算。因此,我相信文件驱动的RBAC对许多项目来说已经足够。它是可视的,且易于支持。

角色和权限的存储在逻辑的另一层,因此可以在以后添加数据库支持。

用法

正如我所说,h-rbac是Laravel 5.1及更高版本的授权逻辑的包装器。因此,您可以使用它的任何功能。

if (\Gate::allows('editPost', $post)) { // do something }
...
if (\Gate::denies('editPost', $post)) { abort(403); }
...
if (\Gate::forUser($user)->allows('editPost', $post)) { // do something }

从用户模型

if ($request->user()->can('editPost', $post)) { // do something }
...
if ($request->user()->cannot('editPost', $post)) { abort(403); }

在控制器中

$this->authorize('editPost', $post);

在Blade中

@can('editPost', $post)
    <!-- The Current User Can Update The Post -->
@else
    <!-- The Current User Can't Update The Post -->
@endcan

此外,在h-rbac中,我们添加了指令@role,您可以将其与@else一起使用

@role('user|manager')
	<!-- The current user has any role -->
@endrole

配置

当您使用 artisan 发布配置时,您将拥有配置类 app/Classes/Authorization/AuthorizationClass.php,您应该在其中定义权限、角色和回调。您可以将此文件移动到任何您想要的位置。不要忘记在这种情况下更新 config/h-rbac.php

配置类的结构

<?php
namespace App\Classes\Authorization;
use Dlnsk\HierarchicalRBAC\Authorization;

class AuthorizationClass extends Authorization
{
	public function getPermissions() {
		return [
			'editPost' => [
					'description' => 'Edit any posts',  // optional property
					'next' => 'editOwnPost',            // used for making chain (hierarchy) of permissions
				],
			'editOwnPost' => [
					'description' => 'Edit own post',
				],
			'deletePost' => [
					'description' => 'Delete any posts',
				],
		];
	}

	public function getRoles() {
		return [
			'manager' => [
					'editPost',
					'deletePost',
				],
			'user' => [
					'editOwnPost',
				],
		];
	}

	////////////// Callbacks ///////////////
	
	public function editOwnPost($user, $post) {
		$post = $this->getModel(\App\Post::class, $post);  // helper method for geting model

		return $user->id === $post->user_id;
	}

}

只有当您需要对此权限进行额外检查时,才应添加回调。 回调的名称应与权限的驼峰命名相同。

我们使用以下逻辑来检查权限:从当前权限开始,我们逐个检查以下链中的所有内容

  • 允许 如果角色具有没有回调的权限
  • 允许 如果角色具有权限且回调返回 true
  • 拒绝 如果角色链中没有任何权限
  • 拒绝 如果角色具有权限但回调返回 false(在这种情况下,我们不检查链中的任何剩余权限)

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

贡献

有关详细信息,请参阅 CONTRIBUTINGCONDUCT

鸣谢

许可

MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件