xdroidteam/xtrust

基于角色和权限的laravel权限管理

1.0.2 2023-04-20 10:35 UTC

README

MIT licensed

内容

关键特性

  1. 您有角色和权限。权限可以附加到角色,角色可以附加到单个用户,但您也可以直接将权限/权限附加或从特定用户中移除。
  2. 权限和角色存储在缓存中,编辑它们会自动刷新。我们使用缓存标签,因此常规文件或数据库缓存驱动程序不起作用,请使用memcached
  3. 灵感来自Zizaco/entrust
  4. 请注意,该包处于开发中,仅与Laravel 5.2进行了测试。

安装

将以下行添加到您的composer.json(Laravel 5.4及以下)

"xdroidteam/xtrust": "0.1.*"

将以下行添加到您的composer.json(Laravel 5.5)

"xdroidteam/xtrust": "0.2.*"

然后运行composer update

或者您可以从终端运行composer require命令

composer require xdroidteam/xtrust

然后在您的config/app.php中将以下内容添加到providers数组(Laravel 5.5之后不需要)

XdroidTeam\XTrust\XTrustServiceProvider::class,

并添加到aliases数组(Laravel 5.5之后不需要)

'XTrust' => XdroidTeam\XTrust\XTrust::class,

如果您打算使用中间件(需要Laravel 5.1或更高版本),您还需要添加以下内容

'permission' => \XdroidTeam\XTrust\Middleware\XTrustPermissionMiddleware::class,

routeMiddleware数组在app/Http/Kernel.php

迁移

部署迁移文件

php artisan vendor:publish --tag=xdroidteam-xtrust

现在您可以使用artisan migrate命令运行它

php artisan migrate

模型

角色

app/models/Role.php内部创建一个Role模型,使用以下示例

<?php namespace App\Models;

use XdroidTeam\XTrust\Models\XTrustRole;

class Role extends XTrustRole
{
  ...
}

权限

app/models/Permission.php内部创建一个Permission模型,使用以下示例

<?php namespace App\Models;

use XdroidTeam\XTrust\Models\XTrustPermission;

class Permission extends XTrustPermission
{
  ...
}

用户

接下来,在您的现有User模型中使用XTrustUserTrait特征。例如

<?php

use XdroidTeam\XTrust\Traits\XTrustUserTrait;

class User extends Eloquent
{
    use XTrustUserTrait; // add this trait to your user model

    ...
}

别忘了运行composer自动加载

composer dump-autoload

概念

有角色和权限。您可以将许多权限附加到角色,并将许多角色附加到用户,就像在Zizaco/entrust中一样。主要区别在于您可以直接将权限/权限附加或从用户中移除。

例如

您有四个权限

  1. can_show
  2. can_create
  3. can_edit
  4. can_delete

您有两个角色,具有以下权限

  1. admin
  2. can_show
  3. can_create
  4. can_edit
  5. can_delete
  6. user
  7. can_show

您有两个用户,具有以下角色

  1. Adam Admin
  2. admin
  3. Super User
  4. user

如果您不希望Adam Admin能够删除,您可以简单地从他那里移除can_delete权限。管理员组仍然具有can_delete权限,但Adam将不会。如果您想Super User能够编辑,您可以将其权限(can_edit)附加给她。除了她之外,用户角色中的其他用户仍然无法编辑。

因为这个逻辑,您只能检查用户的权限,而不是角色!

UI示例:截图

使用方法

权限检查

简单检查

检查一个权限

XTrust::hasPermission('can_delete');

如果认证用户有权限,则返回true,如果没有,则返回false。

检查多个权限

XTrust::hasPermissions(['can_delete', 'can_edit']);

如果已认证用户拥有所有权限,则返回 true,否则返回 false。

或者

XTrust::hasOneOfPermissions(['can_delete', 'can_edit']);

如果已认证用户拥有其中一项权限,则返回 true,否则返回 false。

您也可以在用户模型内进行检查

$user = User::find(1);
$user->hasPermission('can_delete');
// OR
$user->hasPermissions(['can_delete', 'can_edit']);
// OR
$user->hasOneOfPermissions(['can_delete', 'can_edit']);

中间件

Route::group(['middleware' => ['auth', 'permission:can_show']], function(){
    Route::get('/', 'HomeController@index');
});

对于多个权限检查,使用管道符号作为 OR 运算符

Route::group([
	'middleware' => [
    	'auth',
        'permission:can_show|can_create|can_edit|can_delete'
    ]
], function(){
    Route::get('/admin', 'AdminController@index');
});

要模拟 AND 功能,只需使用多个中间件实例。对于多个权限检查,使用管道符号作为 OR 运算符

Route::group([
	'middleware' => [
    	'auth',
        'permission:can_show',
        'permission:can_create'
    ]
], function(){
    Route::get('/admin', 'AdminController@index');
});

Blade

@permission('can_delete')
	{!! Form::open([
    	'url' => '/users/'.$user->id,
        'method'=> "DELETE"
    ] ) !!}
        <button class="btn btn-sm btn-danger">
            Delete
        </button>
    {!! Form::close() !!}
@endpermission

多个权限

@permissions(['can_show', 'can_delete'])
	<span>Something</span>
@endpermissions

如果已认证用户拥有所有权限,则返回 true,否则返回 false。

或者

@oneofpermissions(['can_show', 'can_delete'])
	<span>Something</span>
@endoneofpermissions

如果已认证用户拥有其中一项权限,则返回 true,否则返回 false。

角色检查

简单检查

检查一个角色

XTrust::hasRole('can_delete');

如果已认证用户拥有该角色,则返回 true,否则返回 false。

检查多个角色

XTrust::hasRoles(['can_delete', 'can_edit']);

如果已认证用户拥有所有这些角色,则返回 true,否则返回 false。

或者

XTrust::hasOneOfRoles(['can_delete', 'can_edit']);

如果已认证用户拥有其中任何一个角色,则返回 true,否则返回 false。

您也可以在用户模型内进行检查

$user = User::find(1);
$user->hasRole('can_delete');
// OR
$user->hasRoles(['can_delete', 'can_edit']);
// OR
$user->hasOneOfRoles(['can_delete', 'can_edit']);

附加/移除

始终使用角色的 id 或权限的 id 进行附加/移除操作!

附加到用户

将一个角色附加到用户

$user->attachRole(1);

将多个角色附加到用户

$user->attachRoles([1,2]);

将一个权限附加到用户

$user->attachPermission(1);

将多个权限附加到用户

$user->attachPermissions([1,2]);

从用户中移除

从一个用户移除一个角色

$user->detachRole(1);

从一个用户移除多个角色

$user->detachRoles([1,2]);

从一个用户移除一个权限

$user->detachPermission(1);

从一个用户移除多个权限

$user->detachPermissions([1,2]);

附加到角色

将一个权限附加到一个角色

$role->attachPermission(1);

将多个权限附加到一个角色

$role->attachPermissions([1,2]);

从角色中移除

从一个角色移除一个权限

$role->detachPermission(1);

从一个角色移除多个权限

$role->detachPermissions([1,2]);