zaichaopan/access-granted

添加角色和权限的包

v0.1-beta 2018-06-22 01:17 UTC

This package is not auto-updated.

Last update: 2024-09-29 05:55:15 UTC


README

此包允许您在laravel应用中添加角色到用户,添加权限到用户,以及添加权限到角色。它可以用于laravel 5.5或更高版本。

安装

composer require zaichaopan/access-granted

用法

迁移

安装包后,运行迁移命令以迁移rolespermissionsrole_userpermission_userpermission_role表。

php artisan migrate

这些表的架构

// roles
Schema::create('roles', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->unique('name');
    $table->timestamps();
});
// permissions
Schema::create('permissions', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->unique('name');
    $table->timestamps();
});
// permission_user
Schema::create('permission_user', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('user_id');
    $table->unsignedInteger('permission_id');
    $table->unique(['user_id', 'permission_id']);
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->foreign('permission_id')->references('id')->on('permissions') ->onDelete('cascade');
    $table->timestamps();
});
// permission_role
Schema::create('permission_role', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('permission_id');
    $table->unsignedInteger('role_id');
    $table->unique(['permission_id', 'role_id']);
    $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
    $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
    $table->timestamps();
})
// role_user
 Schema::create('role_user', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('role_id');
    $table->unsignedInteger('user_id');
    $table->unique(['role_id', 'user_id']);
    $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->timestamps();
});

分配角色给用户

要将角色分配给用户,向用户模型添加HasRoles特质

// User.php
class User extends Model
{
    use HasRoles;
}

此特质提供了以下方法

  • giveRole
public function giveRole(string ...$roleName): bool

它可以用来给用户分配一个或多个角色。例如

// you have roles in your  admin and manger
$user->giveRole('admin');

// or both
$user->giveRole('admin', 'manager');

注意

如果用户被分配了一个他已经拥有的角色,则不会再次添加该角色。如果用户被分配了一个在角色表中不存在的角色,则不会添加无效的角色。

  • updateRole
public function updateRole(string ...$roleNames) : self

它可以用来更新用户的角色。在调用此方法后,用户将只拥有新的角色,所有旧角色都将被删除。

public function updateRole(string ...$roleNames) : self

注意:

如果更新的角色找不到,则将忽略它,并且用户仍将保持他的旧角色。

  • removeRole
public function removeRole(string ...$roleNames) : self

它可以用来从用户中删除一个或多个角色。例如

// $user have admin and manager roles

// to move manger role
$user->removeRole('manager');

// to move both
$user->removeRole('manager', 'admin');

注意

如果删除的角色找不到或用户没有它,则将被忽略。

  • removeAllRoles
public function removeAllRoles() : self

它用于从用户中删除所有角色。例如

$user->removeAllRoles();
  • hasRole
public function hasRole(string ...$roles) : bool

它可以用来确定用户是否具有一个角色或任何角色列表中的角色。例如

$user->hasRole('admin');

// it will return true if the user is admin or manager
$user->hasRole('admin', 'manager');

分配权限给角色

此包提供了默认由Role模型使用的HasPermissions特质。因此,您可以给角色分配权限,您可以使用特质提供的以下方法。

  • givePermissionTo
public function givePermissionTo(string ...$permissionNames): bool

它可以用来给角色分配一个或多个权限,例如

// your have a role admin and you have permissions which names are: write post and delete post
$adminRole->givePermissionTo('write post');

// or both
$adminRole->givePermissionTo('delete post');

如果给定的权限有效或已分配,则将其忽略。

  • updatePermissionTo
public function updatePermissionTo(string ...$permissionNames): bool

它可以用来更新角色的权限。在调用此方法后,将只保留新的权限,并删除所有旧权限。如果提供了无效的权限,则将其忽略。如果提供的所有权限都是无效的,则方法返回false,并且角色将保留其旧权限。例如

$role->updatePermissionTo('read post');

// or both
$role->updatePermissionTo('read post', 'delete post');
  • withdrawPermissionTo
public function withdrawPermissionTo(string ...$permissionNames): bool

它可以用来从角色中撤销一个或多个权限。如果撤销的权限无效,则将其忽略。如果撤销的所有权限都是无效的,则方法返回false,并且角色将保留其旧权限

$role->withdrawPermissionTo('read post');

// or both
$role->withdrawPermissionTo('read post', 'delete post');
  • withdrawAllPermissions
public function withdrawAllPermissions(): self

它用于从角色中撤销所有权限。

$role->withdrawPermissions();
  • hasPermission
public function hasPermission(string $permission): bool

它可以用来确定角色是否具有特定的权限。例如

$role->hasPermission('read post');

添加权限到用户

要给用户添加权限,只需将HasPermissions特质添加到您的用户模型中。

class User extends Model
{
    use HasRoles,
        HasPermissions;

    // ...
}

现在您可以使用上述所有方法在添加权限到角色部分中分配权限。

通过角色具有权限

当我们在用户模型中同时使用 HasRolesHasPermissions 特性来决定一个用户是否具有特定的权限时,我们需要检查他或她是否通过权限表拥有权限,或者他的或她的角色是否包含这个权限。

为了简化操作,此包提供了一个名为 HasPermissionThroughRole 的另一个特性。要使用它,只需将其添加到您的用户模型中

class User extends Model
{

    use HasRoles, HasPermissions, HasPermissionThroughRole;
}

此特性提供了一个名为 hasPermissionThroughRole 的方法,可以用来判断用户是否具有包含此权限的角色。例如

$user->hasPermissionThroughRole('write post');

注意:

如果我们调用 hasPermission 方法,它只能检查用户是否通过权限表拥有权限。为了避免混淆,我们可以在使用 hasPermissions 特性时给此方法起别名,并重写 hasPermission 方法以包括检查用户的角色权限。

use Zaichaopan\AccessGranted\Traits\{HasPermissions, HasRolePermissions, HasRoles};

class User extends Model
{
    use HasRoles,
        HasRolePermissions,
        HasPermissions { hasPermission as hasPermissionThroughPermissionTrait; }

    protected $connection = 'testbench';

    protected $table = 'users';

    public function hasPermission(string $permission): bool
    {
        return $this->hasPermissionThroughPermissionTrait($permission) || $this->hasPermissionThroughRole($permission);
    }
}

中间件

此包提供了两个中间件:RoleMiddlewarePermissionMiddleware。它们可以用来保护需要特定角色和权限才能访问的任何路由。

要使用它们,请在您的 Kernel.php 中进行注册

protected $routeMiddleware = [
    'role' => \Zaichaopan\AccessGranted\Middleware\RoleMiddleware::class,
    'permission' => \Zaichaopan\AccessGranted\Middleware\PermissionMiddleware::class,
];

要使用它们

class AdminController extends Controller
{
    public function __construct()
    {
        $this->middleware('role:admin')
    }
}
class PostsController extends Controller
{
    public function __construct()
    {
        $this->middleware('permission:edit post')
    }
}

Blade指令

此包提供了一种blade指令,可以在blade中使用来保护只有特定角色可以访问的内容。

@role('admin')
<!-- content here  -->
@endrole

仅允许具有给定权限的用户访问某些内容。使用

@can('edit post')
<!-- content here -->
@endcan