rennokki / guardian
Eloquent Guardian 是一个为您的用户提供的简单权限系统。尽管有其他许多权限包,但这个包以最优雅的方式解决了所有问题。
Requires
- laravel/framework: ~5.5
Requires (Dev)
- orchestra/database: ~3.5.0|~3.6.0
- orchestra/testbench: ~3.5.0|~3.6.0
- phpunit/phpunit: ^6.2|^7.0
README
此包不再维护
迁移到其他具有如角色等丰富功能的现有权限包
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()
方法来进一步处理您的异常。