zaichaopan / access-granted
添加角色和权限的包
Requires
- php: >=7.1
- illuminate/support: ~5.5.0|~5.6.0
Requires (Dev)
- orchestra/testbench: ^3.5.0
- phpunit/phpunit: ^7.2
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
用法
迁移
安装包后,运行迁移命令以迁移roles、permissions、role_user、permission_user和permission_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; // ... }
现在您可以使用上述所有方法在添加权限到角色部分中分配权限。
通过角色具有权限
当我们在用户模型中同时使用 HasRoles 和 HasPermissions 特性来决定一个用户是否具有特定的权限时,我们需要检查他或她是否通过权限表拥有权限,或者他的或她的角色是否包含这个权限。
为了简化操作,此包提供了一个名为 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); } }
中间件
此包提供了两个中间件:RoleMiddleware 和 PermissionMiddleware。它们可以用来保护需要特定角色和权限才能访问的任何路由。
要使用它们,请在您的 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