kerigard/laravel-roles

此包已被废弃,不再维护。未建议替代包。

Laravel的权限和角色

v1.1.3 2023-02-25 10:32 UTC

This package is auto-updated.

Last update: 2024-02-25 13:04:09 UTC


README

Build Status Total Downloads Latest Stable Version License

Laravel 9.20及以上版本的权限和角色。

安装

使用composer安装包

composer require kerigard/laravel-roles

使用vendor:publish artisan命令发布配置和迁移文件

php artisan vendor:publish --provider="Kerigard\LaravelRoles\RolesServiceProvider"

根据需求自定义roles.php配置文件。之后运行迁移

php artisan migrate

使用方法

连接特性

要开始使用权限和角色检查,您的User模型必须使用Kerigard\LaravelRoles\Traits\HasRolesKerigard\LaravelRoles\Traits\HasPermissions特性

use Kerigard\LaravelRoles\Traits\HasPermissions;
use Kerigard\LaravelRoles\Traits\HasRoles;

class User extends Authenticatable
{
    use HasPermissions;
    use HasRoles;
}

无需同时连接这两个特性。

创建角色和权限

创建角色和权限,然后创建它们之间的关系

use Kerigard\LaravelRoles\Models\Permission;
use Kerigard\LaravelRoles\Models\Role;

$role = Role::create(['name' => 'Manager', 'slug' => 'manager']);
$permission = Permission::create(['name' => 'Edit articles', 'slug' => 'edit-articles']);
$role->attachPermission($permission);

您可以通过配置文件覆盖模型。

将角色或权限连接到用户

$user->attachRole(1);
$user->attachRole($adminRole);
$user->attachRole('super-admin');
$user->attachRole([1, $adminRole, 'manager']);

$user->attachPermission(1);
$user->attachPermission($editPostsPermission);
$user->attachPermission('edit-articles');
$user->attachPermission([1, $editPostsPermission, 'edit-articles']);

您可以为用户禁用角色或权限

$user->detachRole(1);
$user->detachRole($adminRole);
$user->detachRole('super-admin');
$user->detachRole([1, $adminRole, 'manager']);
$user->detachAllRoles();

$user->detachPermission(1);
$user->detachPermission($editPostsPermission);
$user->detachPermission('edit-articles');
$user->detachPermission([1, $editPostsPermission, 'edit-articles']);
$user->detachAllPermissions();

或者仅同步指定的角色或权限。未列出的角色或权限将被禁用

$user->syncRoles(1);
$user->syncRoles($adminRole);
$user->syncRoles('super-admin');
$user->syncRoles([1, $adminRole, 'manager']);

$user->syncPermissions(1);
$user->syncPermissions($editPostsPermission);
$user->syncPermissions('edit-articles');
$user->syncPermissions([1, $editPostsPermission, 'edit-articles']);

如果不想在同步时禁用旧角色或权限,请使用此方法

$user->syncRolesWithoutDetaching($role);
$user->syncPermissionsWithoutDetaching($permission);

权限检查

要检查权限,请运行

$user->hasPermission('edit-articles');
$user->hasPermission(1);
$user->hasPermission($permission);

// has all permissions
$user->hasPermission(['edit-articles', 'register-articles']);
// has any permissions
$user->hasAnyPermission(['edit-articles', 'register-articles']);

$user->doesNotHasPermission($permission);
$user->doesNotHasAnyPermission(['edit-articles', 'register-articles']);

// or check that the role contains the permission
$role->hasPermission('edit-articles');

所有权限都已与Laravel Gates注册,因此您可以使用can函数

$user->can('edit-articles');
$user->can(['edit-articles', 'register-articles']);
$user->canAny(['edit-articles', 'register-articles']);

在控制器中,您可以使用authorize函数,如果用户没有权限则抛出异常

class PostController extends Controller
{
    public function index()
    {
        $this->authorize('view-posts');

        return Post::all();
    }
}

角色检查

要检查是否存在角色,请运行

$user->hasRole('manager');
$user->hasRole(1);
$user->hasRole($role);

// has all roles
$user->hasRole(['manager', 'admin']);
// kas any roles
$user->hasAnyRole(['manager', 'admin']);

$user->doesNotHasRole($role);
$user->doesNotHasAnyRole(['manager', 'admin']);

如果要在控制器中检查角色并在缺失时抛出异常,则需要替换app\Http\Controllers\Controller.php文件中的特性导入

// from
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
// to
use Kerigard\LaravelRoles\Traits\AuthorizesRequests;

之后,您可以使用hasRole函数

class PostController extends Controller
{
    public function index()
    {
        $this->authorizeRole('editor');

        return Post::all();
    }
}

Blade指令

您可以在blade文件中使用指令方便地编写条件

@can('edit-articles')
    //
@endcan

@canany(['edit-articles', 'register-articles'])
    //
@endcanany

@is('manager')
    //
@endis

@isany(['manager', 'admin'])
    //
@endisany

中间件

app/Http/Kernel.php文件中,您可以指定用于检查角色和权限的中间件

protected $routeMiddleware = [
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'is' => \Kerigard\LaravelRoles\Middlewares\AuthorizeRole::class,
];

然后您可以保护路由

Route::put('users', [UserController::class, 'update'])->middleware('can:edit-users');
// or
Route::put('users', [UserController::class, 'update'])->can('edit-users');

Route::get('users', [UserController::class, 'index'])->middleware('is:admin');
// or
Route::get('users', [UserController::class, 'index'])->is('admin');

自定义状态

默认情况下,Laravel在抛出异常时会返回一个403错误代码和消息This action is unauthorized。您可以为每个角色和权限指定自己的错误代码和消息

Role::create([
    'name' => 'Admin',
    'slug' => 'admin',
    'status' => 404,
    'message' => 'Not found',
]);
Permission::create([
    'name' => 'Edit users',
    'slug' => 'edit-users',
    'status' => 404,
    'message' => 'Not found',
]);

超级管理员

在配置中,您可以选择启用超级管理员角色。具有此角色的用户,所有权限和角色检查都将为 true

变更日志

请参阅 变更日志 了解最近有哪些变化。

许可证

MIT。请参阅 许可证文件 了解更多信息。