rennokki/guardian

此包已被废弃,不再维护。作者建议使用spatie/laravel-permission包。

Eloquent Guardian 是一个为您的用户提供的简单权限系统。尽管有其他许多权限包,但这个包以最优雅的方式解决了所有问题。

1.5.1 2019-03-01 09:16 UTC

This package is auto-updated.

Last update: 2021-02-27 11:13:57 UTC


README

Build Status codecov StyleCI Latest Stable Version Total Downloads Monthly Downloads License

PayPal

此包不再维护

迁移到其他具有如角色等丰富功能的现有权限包

Eloquent Guardian

Eloquent Guardian 是一个为您的用户提供的简单权限系统。尽管有其他许多权限包,但这个包以最优雅的方式解决了所有问题。

安装

安装包

$ composer require rennokki/guardian

如果你的Laravel版本不支持包发现,请在你的 config/app.php 文件的 providers 数组中添加此行

Rennokki\Guardian\GuardianServiceProvider::class,

发布配置文件和迁移文件

$ php artisan vendor:publish

迁移数据库

$ php artisan migrate

HasPermissions 特性添加到你的 Eloquent 模型中

use Rennokki\Guardian\Traits\HasPermissions;

class User extends Model {
    use HasPermissions;
    ...
}

权限类型

  • 字符串类型只是一个字符串,它与任何模型无关。它适用于包含访问能力或功能的权限。
$user->allow('access.dashboard');
  • 全局类型与一个模型相关,但不是特定的一个。如果设置,它可以控制任何ID的任何模型。
$user->allow('edit', Post::class);
  • 全局特定类型与一个特定模型相关。它不能控制除这个特定模型之外的任何其他模型。
$user->allow('edit', App\Post::class, 'post_id_here');

检查权限

您可以使用 can()cannot()cant() 在模型内部检查权限。

$user->can('access.dashboard');
$user->cannot('sell.products');
$user->cant('sell.products'); // alias to cannot()

如果您的用户对一个模型上的操作有权限,它将能够访问带有任何ID的任何模型。

$user->allow('view', \App\Flight::class);
$user->can('view', \App\Flight::class, 1); // true, can view flight with ID 1

允许和撤销禁止权限

允许或撤销禁止会产生对该权限的访问权限。

$user->allow('cloning');
$user->unprohibit('cloning'); // same as allow

禁止和禁止权限

禁止或禁止权限可以在任何时候进行。结果始终相同:拒绝访问。

$user->disallow('commenting');
$user->prohibit('commenting'); // same as disallow

全局类型优于特定类型

假设您有一个 Post 类,并且用户只能编辑或删除他自己的帖子。使用这种方法,当您检查全局类型时,它将返回 false,但如果您检查特定类型,则不会。

$user->allow('edit', Post::class, 'his_post_id');
$user->allow('delete', Post::class, 'his_post_id');

$user->can('edit', Post::class); // false
$user->can('edit', Post::class, 'his_post_id'); // true

如果您允许用户编辑 Post::class,它将能够编辑任何类,具有任何ID。

$user->allow('edit', Post::class);
$user->can('edit', Post::class, 1); // true

中间件

您可以使用模型中的方法,或者使用中间件来过滤当前认证用户的权限。

为此,您应该将中间件添加到 app\Http\Kernel.php 中的 $routeMiddleware 数组。

'guardian' => \Rennokki\Guardian\Middleware\CheckPermission::class,

您可以在路由中使用它来自动过滤权限,并在发生问题时抛出特定的异常。

  • 字符串中间件
Route::get('/admin', 'AdminController@ControlPanel')->middleware('guardian:access.dashboard');
  • 全局类型
Route::post('/admin/products', 'AdminController@CreateProduct')->middleware('guardian:create,App\Product');
  • 全局特定类型
Route::patch('/admin/{post_id}', 'AdminController@EditPost')->middleware('guardian:edit,App\Post,post_id');

注意:您不需要放置具体的帖子ID,只需指出该模型的ID将在路由URL中的位置。

  • Rennokki\Guardian\Exceptions\PermissionException,如果认证用户没有权限。
  • Rennokki\Guardian\Exceptions\RouteException,如果传递的路由参数不存在。

您可以在异常中访问permission()modelType()modelIdPlaceholder()方法来进一步处理您的异常。