marievych/roles

用于处理 Laravel 5.4 中角色和权限的强大包

5.4 2017-06-08 10:43 UTC

This package is not auto-updated.

Last update: 2024-09-29 02:08:28 UTC


README

用于处理 Laravel 5.4 中角色和权限的强大包

安装

此包非常易于设置。只需几个步骤。

Composer

通过 Composer 拉取此包

composer require marievych/roles

服务提供者

将包添加到您的应用服务提供者中,在 config/app.php 文件中。

'providers' => [
    
    ...
    
    /**
     * Third Party Service Providers...
     */
    Marievych\Roles\RolesServiceProvider::class,

],

配置文件和迁移

将包的配置文件和迁移发布到您的应用。在您的终端中运行以下命令。

php artisan vendor:publish --provider="Marievych\Roles\RolesServiceProvider" --tag=config
php artisan vendor:publish --provider="Marievych\Roles\RolesServiceProvider" --tag=migrations

并运行迁移。

php artisan migrate

这使用 Laravel 中的默认用户表。您应该已经有了用户表的迁移文件并且已经迁移。

HasRoleAndPermission 特性和契约

包含 HasRoleAndPermission 特性,并在您的 User 模型中实现 HasRoleAndPermission 契约。

使用方法

创建角色

use Marievych\Roles\Models\Role;

$adminRole = Role::create([
    'name' => 'Admin',
    'slug' => 'admin',
    'description' => '', // optional,
]);

$moderatorRole = Role::create([
    'name' => 'Forum Moderator',
    'slug' => 'forum.moderator',
    'parent_id'=>1, //optional
]);

由于 Slugable 特性,如果发生错误,例如在 slug 参数中留下空格,它将被自动替换为点,这是由于 str_slug 函数。

附加、分离和同步角色

非常简单。从数据库中获取用户并调用 attachRole 方法。在 UserRole 模型之间存在 BelongsToMany 关系。

use App\User;

$user = User::find($id);

$user->attachRole($adminRole); // you can pass whole object, or just an id
$user->detachRole($adminRole); // in case you want to detach role
$user->detachAllRoles(); // in case you want to detach all roles
$user->syncRoles($roles); // you can pass Eloquent collection, or just an array of ids

检查角色

现在您可以检查用户是否具有所需的角色。

if ($user->hasRole('admin')) { // you can pass an id or slug
    //
}

您也可以这样做

if ($user->isAdmin()) {
    //
}

当然,还有检查多个角色的方法

if ($user->hasRole(['admin', 'moderator'])) { 
    /*
    | Or alternatively:
    | $user->hasRole('admin, moderator'), $user->hasRole('admin|moderator'),
    | $user->hasOneRole('admin, moderator'), $user->hasOneRole(['admin', 'moderator']), $user->hasOneRole('admin|moderator')
    */

    // The user has at least one of the roles
}

if ($user->hasRole(['admin', 'moderator'], true)) {
    /*
    | Or alternatively:
    | $user->hasRole('admin, moderator', true), $user->hasRole('admin|moderator', true),
    | $user->hasAllRoles('admin, moderator'), $user->hasAllRoles(['admin', 'moderator']), $user->hasAllRoles('admin|moderator')
    */

    // The user has all roles
}

继承

如果您不希望应用中包含继承功能,简单地在创建角色时忽略 parent_id 参数。

分配给其他角色的角色将自动继承,当用户分配或继承父角色时。

以下是一个示例

您有 5 个管理组。管理员、商店管理员、商店库存管理员、博客管理员和博客作家。

管理员角色商店管理员角色博客管理员角色 的父角色。

商店管理员角色商店库存管理员角色 的父角色。

博客管理员角色博客作家 的父角色。

这使 管理员角色 能够继承 商店库存管理员角色博客作家角色

商店管理员角色 只继承 商店库存管理员角色

博客管理员角色 只继承 博客作家角色

另一个示例

在这里,admin 继承 admin.useradmin.blogblog.writer

admin.user 不继承任何内容,而 admin.blog 继承 blog.writer

没有内容继承 development,而 development 也不继承任何内容。

创建权限

多亏了 Permission 模型,这非常简单。

use Marievych\Roles\Models\Permission;

$createUsersPermission = Permission::create([
    'name' => 'Create users',
    'slug' => 'create.users',
    'description' => '', // optional
]);

$deleteUsersPermission = Permission::create([
    'name' => 'Delete users',
    'slug' => 'delete.users',
]);

附加、分离和同步权限

您可以将权限附加到角色或直接附加到特定用户(当然,也可以分离它们)。

use App\User;
use Marievych\Roles\Models\Role;

$role = Role::find($roleId);
$role->attachPermission($createUsersPermission); // permission attached to a role

$user = User::find($userId);
$user->attachPermission($deleteUsersPermission); // permission attached to a user
$role->detachPermission($createUsersPermission); // in case you want to detach permission
$role->detachAllPermissions(); // in case you want to detach all permissions
$role->syncPermissions($permissions); // you can pass Eloquent collection, or just an array of ids

$user->detachPermission($deleteUsersPermission);
$user->detachAllPermissions();
$user->syncPermissions($permissions); // you can pass Eloquent collection, or just an array of ids

检查权限

if ($user->hasPermission('create.users')) { // you can pass an id or slug
    //
}

if ($user->canDeleteUsers()) {
    //
}

您可以通过与角色相同的方式检查多个权限。您可以使用额外的函数如 hasOnePermissionhasAllPermissions

实体检查

假设您有一篇文章并想编辑它。这篇文章属于一个用户(文章表中有一个user_id列)。

use App\Article;
use Marievych\Roles\Models\Permission;

$editArticlesPermission = Permission::create([
    'name' => 'Edit articles',
    'slug' => 'edit.articles',
    'model' => 'App\Article',
]);

$user->attachPermission($editArticlesPermission);

$article = Article::find(1);

if ($user->allowed('edit.articles', $article)) { // $user->allowedEditArticles($article)
    //
}

这个条件检查当前用户是否是文章的所有者。如果不是,它将在用户权限中查找我们之前创建的行。

if ($user->allowed('edit.articles', $article, false)) { // now owner check is disabled
    //
}

Blade 扩展

有四个Blade扩展。基本上,它是经典if语句的替代品。

@role('admin') // @if(Auth::check() && Auth::user()->hasRole('admin'))
    // user has admin role
@endrole

@permission('edit.articles') // @if(Auth::check() && Auth::user()->hasPermission('edit.articles'))
    // user has edit articles permissison
@endpermission

@allowed('edit', $article) // @if(Auth::check() && Auth::user()->allowed('edit', $article))
    // show edit button
@endallowed

@role('admin|moderator', true) // @if(Auth::check() && Auth::user()->hasRole('admin|moderator', true))
    // user has admin and moderator role
@else
    // something else
@endrole

中间件

此包包含VerifyRoleVerifyPermission中间件。您必须在app/Http/Kernel.php文件中添加它们。

/**
 * The application's route middleware.
 *
 * @var array
 */
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'role' => \Marievych\Roles\Middleware\VerifyRole::class,
    'permission' => \Marievych\Roles\Middleware\VerifyPermission::class,
];

现在您可以轻松地保护您的路由。

$router->get('/example', [
    'as' => 'example',
    'middleware' => 'role:admin',
    'uses' => 'ExampleController@index',
]);

$router->post('/example', [
    'as' => 'example',
    'middleware' => 'permission:edit.articles',
    'uses' => 'ExampleController@index',
]);

如果出错,它会抛出\Marievych\Roles\Exceptions\RoleDeniedException\Marievych\Roles\Exceptions\PermissionDeniedException异常。

您可以在app/Exceptions/Handler.php文件中捕获这些异常并执行您想要的任何操作。

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $e
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $e)
{
    if ($e instanceof \Marievych\Roles\Exceptions\RoleDeniedException) {
        // you can for example flash message, redirect...
        return redirect()->back();
    }

    return parent::render($request, $e);
}

配置文件

您可以更改模型连接、slug分隔符、模型路径,还有一个方便的模拟功能。查看配置文件以获取更多信息。

更多信息

有关更多信息,请参阅HasRoleAndPermission契约。

许可证

此包是免费软件,根据MIT许可条款分发。