coyote6/laravel-permissions

提供权限和角色模型,可用于分配给用户。如果与coyote6/laravel-crud一起使用,则自动添加管理页面。

v0.1.7 2024-03-04 22:12 UTC

This package is auto-updated.

Last update: 2024-09-04 23:16:43 UTC


README

一个用于管理权限和用户角色的包。

使用方法

  1. 安装:需要coyote6/laravel-permissions
  2. 可选:如果需要更改数据表名称,请发布配置文件。

默认以下

return [	
	
	'tables' => [
		'permissions' => 'permissions',
		'roles' => 'roles',
		'role-permissions' => 'role_permissions',
		'user-roles' => 'user_roles',
		'users' => 'users'								// This needs to match your user table name
	]

];
php artisan vendor:publish --tag=permissions
  1. 运行迁移(如果你想要默认值,也可以运行种子)
php artisan migrate

php artisan migrate --seed

db::seed --class=Coyote6\LaravelPermissions\Resources\Databases\Seeders\PermissionsSeeder
  1. 将特质添加到User模型。
use Coyote6\LaravelPermissions\Traits\HasRoles;
use Coyote6\LaravelPermissions\Traits\UserRoles;

class User extends Authenticatable {

	// Add the traits.
	use HasRoles,
		UserRoles;

}
  1. 将特质添加到所有需要的策略。
use Coyote6\LaravelPermissions\Traits\AdminAccessTrait;

class ExamplePolicy {
	use AdminAccessTrait;
}	
  1. 通过代码将管理角色添加到您的管理员用户
$u = User::find(1);
$u->addRole('administrator');

(正在开发更好的方法)

  1. 一旦您的管理员用户拥有管理员角色,如果使用coyote6/laravel-crud包,请访问您网站上的'/admin/users',并从那里管理任何额外的角色。

  2. 要创建权限和角色,并将权限添加到角色,可以使用以下代码示例

use Coyote6\LaravelPermissions\Models\Permissions;
use Coyote6\LaravelPermissions\Models\Models;

$permission = Permission::create (['name' => 'Name of Permission']); // A machine name id will automatically be created.
$role = Role::create (['name' => 'Name of Permission']); // A machine name id will automatically be created.

$role->addPermission($permission);

或者,如果使用coyote6/laravel-crud包,请分别访问网站上的'/admin/users/permissions'和'/admin/users/roles'。

  1. 可选:将权限代码添加到策略和/或使用策略特质(见下面的策略特质)
class ExamplePolicy {


	use AdminAccessTrait,
		HandlesAuthorization;
	
	
	public function view (User $user) {
		
		//
		// Example using the machine name id for the permission
		//
		if ($user->hasPermission ('do_something')) {
			return true;
		}
		return false;
	}
	
	
	public function create (User $user) {
		
		//
		// Example using the name for the permission
		//
		if ($user->hasPermission ('Create Example', 'name')) {
			return true;
		}
		return false;
	}
}
  1. 可选:通过blade指令将权限代码按需添加到模板。

Blade指令

User Can - 权限ID(s)

<div>
	@usercan ('do_something')
		<p>Show if user can do something</p>
	@endusercan
</div>
<div>
	@usercan ('do_something|do_something_else')
		<p>Show if user can do something or do something else</p>
	@endusercan
</div>

User Is - 用户ID(s)

<div>
	@useris (1)
		<p>Show if user is user - 1</p>
	@enduseris
</div>
<div>
	@useris ('1|2|3')
		<p>Show if user is user - 1, 2, or 3</p>
	@enduseris
</div>

User Is and Can - 用户ID(s) 和 权限ID(s)

<div>
	@userisandcan (1, 'do_something')
		<p>Show if user is user - 1</p>
	@enduserisandcan
</div>
<div>
	@userisandcan ('1|2|3', 'do_something|do_something_else')
		<p>Show if user is user - 1,2, or 3 and can do something or can do something else</p>
	@enduserisandcan
</div>

Author Or Can - 用户ID(s) 和 有权限或有其他权限

<div>
	@authororcan (1, 'do_something', 'do_something_else')
		<p>Show if user is user - 1 and can do something or the user is any user who can do something else</p>
	@endauthororcan
</div>
<div>
	@authororcan ('1|2|3', 'do_something|do_something_else', 'do_some_other_thing_1|do_some_other_thing_2')
		<p>Show if user is user - 1,2, or 3 and can do something or can do something else or if the user is any user who can do some other thing 1 or 2.</p>
	@endauthororcan
</div>

策略特质

现在可以使用StandardPolicy、StandardAuthorPolicy、StandardClientPolicy和StandardAuthorOrClientPolicy来轻松编写模型的策略。

策略特质遵循使用权限名称检查用户权限的标准方法。StandardPolicy的权限名称应遵循以下约定,其中[PLURAL_MODEL_NAME]应替换为模型的单数形式的小写:administer_[PLURAL_MODEL_NAME] create_[PLURAL_MODEL_NAME] update_[PLURAL_MODEL_NAME] delete_[PLURAL_MODEL_NAME] view_[PLURAL_MODEL_NAME] search_[PLURAL_MODEL_NAME]

StandardAuthorPolicy扩展了StandardPolicy,允许用户始终访问他们自己的模型权限。

StandardClientPolicy扩展了StandardPolicy,但还添加了以下权限,并检查用户的客户端ID是否与模型的客户端ID匹配:administer_client_[PLURAL_MODEL_NAME] update_client_[PLURAL_MODEL_NAME] delete_client_[PLURAL_MODEL_NAME] view_client_[PLURAL_MODEL_NAME] search_client_[PLURAL_MODEL_NAME]

StandardAuthorOrClientPolicy将StandardAuthorPolicy与StandardClient Policy结合,允许用户在他们是所有者或所有者是他们的客户端时访问模型。

使用策略特质

要使用这些策略特质,请将特质附加到策略并编写$modelPermissionName属性中的权限名称。这将与编写权限时使用的相同的[PLURAL_MODEL_NAME]相同。

<?php


namespace App\Policies;


use App\Traits\StandardPolicy;
use Illuminate\Auth\Access\HandlesAuthorization;


class ModelPolicy {


	use StandardPolicy,
		HandlesAuthorization;
		
	protected string $modelPermissionName = 'models';

}

当策略使用authorize()方法调用以下6个动作之一时,它将对模型上的这些6个权限之一生成对动作权限的检查。因此,如果将$modelPermissionName属性设置为'models',当authorize()方法设置其动作时,这些是它检查的权限名称

$this->authorize('administer', $model) - administer_models
$this->authorize('viewCrud', $model) - administer_models
$this->authorize('viewUserCrud', $model) - view_models
$this->authorize('search', $model) - search_models
$this->authorize('view', $model') - view_models
$this->authorize('create' $model) - create_models
$this->authorize('update', $model) - update_models
$this->authorize('delete', $model) - delete_models

可选参数

模型类型检查($autoDetectPolicy & $modelClass) - 所有策略特质

StandardPolicy 特性有两个额外的参数,允许您检查在 authorize() 方法中提供的模型是否与策略中预期的匹配。如果您使用 Laravel 的自动检测策略,则这些参数是不必要的,但在手动映射策略时可能是一个好主意,但绝对不是必需的。它们的存在只是为了防止意外地将错误的策略映射到模型,并有助于通过允许不正确的权限来防止可能的安全漏洞。

第一步是将策略的自动检测设置为 false。

protected bool $autoDetectPolicy = false;

除了 false 之外的其他任何值都将导致 $this->autoDetectPolicy 回退到默认的 true,并且不再检查模型。

接下来是设置策略的 $modelClass 属性。这应该是被检查的模型的完整命名空间和类名。

protected string $modelClass = Model::class;

protected string $modelClass = 'App\Models\Model';

模型所有者($modelOwnerProperty)- StandardAuthorPolicy & StandandAuthorOrClientPolicy

模型所有者属性允许您更改模型的所有者,如果您使用除默认的 author_id 之外的值来关联到 $user->id。

示例

// $model->user_id is a reference to $user->id
protected string $modelOwnerProperty = 'user_id';
// $model->owner_id is a reference to $user->id
protected string $modelOwnerProperty = 'owner_id';

模型客户端($modelClientProperty)- StandardClientPolicy & StandandAuthorOrClientPolicy

客户端所有者属性允许您更改模型的客户端 ID,如果您使用除默认的 client_id 之外的值来关联到 $user->client_id。

示例

// $model->client is a reference to $user->client
protected string $modelClientProperty = 'client';
// $model->team_id is a reference to $user->team_id
protected string $modelClientProperty = 'team_id';

覆盖权限名称

如果您需要更改默认的权限前缀,可以通过以下方式使用它们的属性名称来执行

protected string $administerPrefix = 'administer_';
protected string $viewPrefix = 'view_';
protected string $searchPrefix = 'search_';
protected string $createPrefix = 'create_';
protected string $updatePrefix = 'update_';
protected string $deletePrefix = 'delete_';

// Client Policy Prefixes
protected string $administerClientPrefix = 'administer_client_';
protected string $viewClientPrefix = 'view_client_';
protected string $searchClientPrefix = 'search_client_';
protected string $updateClientPrefix = 'update_client_';
protected string $deleteClientPrefix = 'delete_client_';

或者,您可以覆盖它们的获取方法

$this->getAdministerPrefix();
$this->getViewPrefix();
$this->getSearchPrefix();
$this->getCreatePrefix();
$this->getUpdatePrefix();
$this->getDeletePrefix();


// Client Policy Prefix Methods
$this->getAdministerClientPrefix();
$this->getViewClientPrefix();
$this->getSearchClientPrefix();
$this->getUpdateClientPrefix();
$this->getDeleteClientPrefix();

示例

protected string $updatePrefix = 'edit_';

这将更改正在检查的权限从 'update_models' 更改为 'edit_models'。