balfour / laravel-custodian
Laravel 中处理基于角色的权限的轻量级库
Requires
- php: >=7.2.0
- illuminate/contracts: ^5.8
- illuminate/database: ^5.8
- illuminate/queue: ^5.8
- illuminate/support: ^5.8
- nesbot/carbon: ^1.26.3 || ^2.0
This package is auto-updated.
Last update: 2024-09-17 10:33:26 UTC
README
Laravel 中处理基于角色的权限的轻量级库。
此库处于早期发布阶段,正在等待单元测试。
目录
为什么?
现在已经有了一些优秀的基于角色的授权库,那么为什么还需要另一个呢?
对于我们内部系统,我们希望有一个这样的库
- 简单易用
- 不包含所有花哨的功能
- 与框架现有的授权库兼容
- 首先关注性能
- 优雅地建模,没有大量关联表 - JSON 类型工作得很好!
我们通过以下方式保持了简单和高效:
- 仅创建了2个表,一个
roles
表和一个将用户映射到角色的role_user
表 - 在
roles
表上的 JSON 列中存储分配的权限 - 仅执行一个数据库查询即可检索所有用户、分配的角色和权限
- 保持用户 -> 权限的对象映射缓存
- 用您选择的任何外部缓存装饰此映射缓存(memcached、redis 等)
安装
composer require balfour/laravel-custodian
配置
该包无需配置即可直接使用,但是如果您想发布配置文件,可以使用以下命令
php artisan vendor:publish --provider="Balfour\LaravelCustodian\ServiceProvider"
自定义用户模型
库将尝试从 auth 配置的默认守卫中检测用户模型的路径。
如果您想使用自定义模型如 \App\User::class
,您可以在 user_model
配置值中指定类路径。
设置用户模型的一种替代方法是通过 Balfour\LaravelCustodian\UserModelResolver::setModel(\App\User::class)
函数。
超级管理员
admins
配置值接受一个电子邮件地址数组,这些地址应该在 custodian 上获得超级管理员访问权限。这意味着这些用户将自动通过所有网关(权限)检查。
我们 不建议 在测试之外使用此功能。您应该使用 Laravel 的 Gate::before
或 Gate::after
钩子来完成此操作。
配置用户模型
将 HasRoles
特性添加到您的用户模型中。
namespace App; use Balfour\LaravelCustodian\HasRoles; use Illuminate\Notifications\Notifiable; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use HasRoles; }
这将建立用户和角色之间的关系;同时为您提供以下实用方法
/** * @param mixed $role */ public function assignRole($role) /** * @param mixed $role */ public function revokeRole($role) /** * @param array $ids */ public function syncRoles(array $ids)
使用方法
创建角色
use Balfour\LaravelCustodian\Models\Role; $admin = Role::create(['name' => 'admin']); $support = Role::create(['name' => 'customer-support']);
注册权限
在将权限分配给角色之前,您必须注册权限。
该库不会将可用权限存储在数据库中,而是将它们注册到 PermissionRegistrar
中。这意味着权限必须在引导时注册,例如在您的应用的 AppServiceProvider
中,或在模块/包的 ServiceProvider
中。
use Balfour\LaravelCustodian\Custodian; $custodian = app(Custodian::class); $custodian->register('create-user'); $custodian->register('view-user'); $custodian->register('view-user-support-tickets');
列出可用权限
use Balfour\LaravelCustodian\Custodian; $custodian = app(Custodian::class); $permissions = $custodian->getAvailablePermissions(); // you could use this to generate a permission matrix for a user, or display a checkbox list // of permissions on an edit user type of page
将权限分配给角色
use Balfour\LaravelCustodian\Models\Role; $admin = Role::where('name', 'admin')->first(); $admin->give('create-user'); $admin->give('view-user');
从角色撤销权限
use Balfour\LaravelCustodian\Models\Role; $admin = Role::where('name', 'admin')->first(); $admin->revoke('create-user');
将角色分配给用户
use App\User; use Balfour\LaravelCustodian\Models\Role; $user = User::find(1); $user->assignRole('admin'); // you can also assign using a model $admin = Role::where('name', 'admin')->first(); $user->assignRole($admin); // or by id $user->assignRole(1);
同步用户角色
use App\User; $user = User::find(1); $user->syncRoles([ 1, 2, ]);
从用户撤销角色
use App\User; use Balfour\LaravelCustodian\Models\Role; $user = User::find(1); $user->revokeRole('admin'); // you can also revoke using a model $admin = Role::where('name', 'admin')->first(); $user->revokeRole($admin); // or by id $user->revokeRole(1);
列出用户角色
use App\User; $user = User::find(1); $roles = $user->roles;
检索用户的权限
use App\User; use Balfour\LaravelCustodian\Custodian; $custodian = app(Custodian::class); $user = User::find(1); $permissions = $custodian->getUserPermissions();
授权用户
该库不会为检查用户是否可以执行特定权限(或能力)添加任何特殊功能。
有关此主题的更多信息,请参阅 Laravel 授权文档。
use App\User; $user = User::find(1); var_dump($user->can('create-user')); // via middleware Route::put('/users/{user}', function (User $user) { })->middleware('can:view-user'); // via blade @can('view-user) // .... @endcan