balfour/laravel-custodian

Laravel 中处理基于角色的权限的轻量级库

0.0.1-alpha 2020-02-24 13:00 UTC

This package is auto-updated.

Last update: 2024-09-17 10:33:26 UTC


README

Laravel 中处理基于角色的权限的轻量级库。

此库处于早期发布阶段,正在等待单元测试。

目录

为什么?

现在已经有了一些优秀的基于角色的授权库,那么为什么还需要另一个呢?

对于我们内部系统,我们希望有一个这样的库

  1. 简单易用
  2. 不包含所有花哨的功能
  3. 与框架现有的授权库兼容
  4. 首先关注性能
  5. 优雅地建模,没有大量关联表 - JSON 类型工作得很好!

我们通过以下方式保持了简单和高效:

  1. 仅创建了2个表,一个 roles 表和一个将用户映射到角色的 role_user
  2. roles 表上的 JSON 列中存储分配的权限
  3. 仅执行一个数据库查询即可检索所有用户、分配的角色和权限
  4. 保持用户 -> 权限的对象映射缓存
  5. 用您选择的任何外部缓存装饰此映射缓存(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::beforeGate::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