kettasoft/gatekeeper

一个轻量级且功能强大的Laravel权限和配置处理包

1.4.5 2023-09-12 16:58 UTC

This package is auto-updated.

Last update: 2024-09-12 19:08:29 UTC


README

本包为Laravel应用程序提供了管理角色和权限的全面系统。它允许轻松创建和管理角色,将权限分配给特定角色,并根据用户分配的角色和权限控制对应用程序不同部分的使用。

Total Downloads Latest Stable Version License PHP Version Require

安装

您可以使用composer安装此包

composer require kettasoft/gatekeeper

在Laravel 5.5中,服务提供者将自动注册。在框架的旧版本中,您必须安装服务提供者

// config/app.php
'providers' => [
    ...
    Kettasoft\Gatekeeper\Providers\GatekeeperServiceProvider::class,
];

发布config/gatekeeper.php配置

php artisan vendor:publish --provider="Kettasoft\Gatekeeper\Providers\GatekeeperServiceProvider" --tag="config"

警告

如果此命令没有发布任何文件,则很可能Laratrust服务提供者尚未注册。尝试清除您的配置缓存

php artisan config:clear

运行设置命令

重要:在运行命令之前,请访问您的config/gatekeeper.php文件,并根据您的需求更改值。

php artisan gatekeeper:migrate

此命令将生成迁移,创建角色和权限模型

use Kettasoft\Gatekeeper\Contracts\GatekeeperInterface;
use Kettasoft\Gatekeeper\Traits\Gatekeeper;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements GatekeeperInterface
{
    use Gatekeeper;

    // ...
}

导出自加载器

composer dump-autoload

运行迁移

php artisan migrate

角色与权限

设置事项

让我们先创建以下角色

$owner = Role::create([
    'name' => 'owner',
    'display_name' => 'Project Owner', // optional
    'description' => 'User is the owner of a given project', // optional
]);

$admin = Role::create([
    'name' => 'admin',
    'display_name' => 'User Administrator', // optional
    'description' => 'User is allowed to manage and edit other users', // optional
]);

角色分配与移除

$user->addRole($admin); // parameter can be a Role object, array, id or the role string name
// equivalent to $user->roles()->attach([$admin->id]);

$user->addRoles([$admin, $owner]); // parameter can be a Role object, array, id or the role string name
// equivalent to $user->roles()->attach([$admin->id, $owner->id]);

$user->syncRoles([$admin->id, $owner->id]);
// equivalent to $user->roles()->sync([$admin->id, $owner->id]);

$user->syncRolesWithoutDetaching([$admin->id, $owner->id]);
// equivalent to $user->roles()->syncWithoutDetaching([$admin->id, $owner->id]);

移除

$user->removeRole($admin); // parameter can be a Role object, array, id or the role string name
// equivalent to $user->roles()->detach([$admin->id]);

$user->removeRoles([$admin, $owner]); // parameter can be a Role object, array, id or the role string name
// equivalent to $user->roles()->detach([$admin->id, $owner->id]);

用户权限分配与移除

您可以为用户分配单个权限,因此要执行此操作,您只需执行以下操作

分配

$user->givePermission(['admin-create', 'admin-delete']); // parameter can be a Permission object, array, id or the permission string name

$user->syncPermissions([$editUser->id, $createPost->id]);
// equivalent to $user->permissions()->sync([$editUser->id, createPost->id]);

$user->syncPermissionsWithoutDetaching([$editUser, $createPost]); // parameter can be a Permission object, array or id
    // equivalent to $user->permissions()->syncWithoutDetaching([$createPost->id, $editUser->id]);

中间件

配置

中间件自动注册为角色、权限。如果您想更改或自定义它们,请访问您的config/gatekeeper.php并设置middleware.register值为false,然后在app/Http/Kernel.php中的routeMiddleware数组中添加以下内容

'role' => \Kettasoft\Gatekeeper\Middleware\Role::class,
'permission' => \Kettasoft\Gatekeeper\Middleware\Permission::class,

概念

您可以使用中间件根据权限、角色过滤路由和路由组

Route::group(['prefix' => 'admin', 'middleware' => ['role:admin']], function() {
    Route::get('/', 'AdminController@welcome');
    Route::get('/manage', ['middleware' => ['permission:manage-admins'], 'uses' => 'AdminController@manageAdmins']);
});

如果您使用管道符号,则它将执行OR操作

'middleware' => ['role:admin|root']
// $user->hasRole(['admin', 'root']);

'middleware' => ['permission:edit-post|edit-user']
// $user->hasRole(['edit-post', 'edit-user']);

要模拟AND功能,您可以这样做

'middleware' => ['role:owner|writer,require_all']
// $user->hasRole(['owner', 'writer'], true);

'middleware' => ['permission:edit-post|edit-user,require_all']
// $user->isAbleTo(['edit-post', 'edit-user'], true);

使用不同的守卫

如果您想使用不同的守卫进行用户检查,可以指定为选项

'middleware' => ['role:owner|writer,require_all|guard:api']
'middleware' => ['permission:edit-post|edit-user,guard:some_new_guard']

中间件返回

中间件支持两种类型的返回值,以失败的情况。您可以在config/gatekeeper.php文件中配置返回类型和值。

中止

默认情况下,中间件使用403代码中止,但您可以更改gatekeeper.middleware.handlers.abort.code值来自定义它。

重定向

如果中间件检查失败,需要重定向,则需要将middleware.handling值更改为redirect,并将gatekeeper.middleware.handlers.redirect.url更改为您需要重定向的路由。保持此配置不变

'handling' => 'redirect',
'handlers' => [
    'abort' => [
        'code' => 403
    ],
    'redirect' => [
        'url' => '/home',       // Change this to the route you need
        'message' => [          // Key value message to be flashed into the session.
            'key' => 'error',
            'content' => ''     // If the content is empty nothing will be flashed to the session.
        ]
    ]
]