alfaj/acl

为 Laravel 应用提供动态配置的访问控制管理

dev-master 2023-05-27 15:52 UTC

This package is not auto-updated.

Last update: 2024-09-28 22:15:55 UTC


README

为 Laravel 应用提供动态配置的访问控制...

安装

composer require alfaj/acl

配置

在你的 laravel 配置文件 app.php 中的 providers 下添加

Alfaj\Acl\AclServiceProvider::class

发布

php artisan vendor:publish

此命令将在 views/vendor/acl 内发布视图文件,在 databases/seed 内发布种子文件,以及一个配置文件 config/acl.php。

种子

在你的 DatabaseSeeder.php 下 database/seeds 添加以下行

$this->call(UserTableSeeder::class); //optional        
$this->call(RoleTableSeeder::class);
$this->call(ResourceTableSeeder::class);
$this->call(PermissionTableSeeder::class);
$this->call(UserRoleTableSeeder::class);

注意:如果你看到任何类未找到的类型错误,尝试运行 composer dump-autoload

artisan

这个库附带一个 artisan 命令 acl:resource,用于自动创建在 app/Http/Controllers 目录下可用的所有资源(controller@action)。要激活此命令,你需要在 app/Console/Kernel.php 文件中添加以下行。

protected $commands = [
    \Alfaj\Acl\Commands\AclResource::class
];

@annotation

Acl 库现在支持两种注解 @resource@allowRole,用于控制器动作

/**
* @resource('able to see home')
* @allowRole('Default, Admin')
*/
public function index()
{
    return view('home');
}

注意:默认情况下,开发者 角色具有最高的权限级别,并且不需要在 @allowRole 注解中提及。如果你删除 @allowRole 注解,它不会从数据库中删除权限,但如果你更改注解中的角色列表,它将相应地更新数据库。

中间件

此 ACL 库附带两个中间件,如下所示。你需要的是 AuthenticateWithAcl 中间件。另一个 ResourceMaker 中间件仅作为在最初不存在资源时创建资源并为其分配权限给 developer 角色的辅助工具。

在你的 kernal.php 文件中添加以下行

'auth.acl' => \Alfaj\Acl\Middleware\AuthenticateWithAcl::class,        
'resource.maker' => \Alfaj\Acl\Middleware\ResourceMaker::class,

在你的 route/web.php 文件中添加以下行

Route::group(['middleware' => ['resource.maker','auth.acl']], function () {    
    Route::get('/home', 'HomeController@index');    
});

重要:必须将 resource.maker 放在 auth.acl 之前。在生产中,一旦所有资源都已生成,你可以删除 resource.maker

角色 & 资源 UI

要访问角色,请访问 YOUR-HOST/role url

要访问资源 UI,请访问 YOUR-HOST/resource url

辅助工具

has_access 检查一个角色是否具有对特定控制器动作的访问权限。

@if(has_access('User\UserController@getIndex'))
OR
@if(has_access('UserController@getIndex'))

has_group_access 检查一个角色是否具有对特定控制器的访问权限

@if(has_group_access(['User-User','User-Role','User-Resource']))
OR
@if(has_group_access('User-User'))

@nullsafe() 检查在流畅接口($obj->prop->value)中是否有任何对象属性为空,如果链断裂,它将简单地返回一个空字符串,并防止出现 call to a member function of a non-object 异常。

Blade 示例

{{ @nullsafe($obj->prop->value) }}

致谢(认可)

感谢 Mahbubul Hasan Uzzal 的 "https://github.com/mahabubulhasan/acl" 包。此包仅是他对 laravel 6 应用程序代码库的改进,并添加了一些附加功能。