coyote6 / laravel-permissions
提供权限和角色模型,可用于分配给用户。如果与coyote6/laravel-crud一起使用,则自动添加管理页面。
Requires
README
一个用于管理权限和用户角色的包。
使用方法
- 安装:需要coyote6/laravel-permissions
- 可选:如果需要更改数据表名称,请发布配置文件。
默认以下
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
- 运行迁移(如果你想要默认值,也可以运行种子)
php artisan migrate
或
php artisan migrate --seed
或
db::seed --class=Coyote6\LaravelPermissions\Resources\Databases\Seeders\PermissionsSeeder
- 将特质添加到User模型。
use Coyote6\LaravelPermissions\Traits\HasRoles; use Coyote6\LaravelPermissions\Traits\UserRoles; class User extends Authenticatable { // Add the traits. use HasRoles, UserRoles; }
- 将特质添加到所有需要的策略。
use Coyote6\LaravelPermissions\Traits\AdminAccessTrait; class ExamplePolicy { use AdminAccessTrait; }
- 通过代码将管理角色添加到您的管理员用户
$u = User::find(1); $u->addRole('administrator');
(正在开发更好的方法)
-
一旦您的管理员用户拥有管理员角色,如果使用coyote6/laravel-crud包,请访问您网站上的'/admin/users',并从那里管理任何额外的角色。
-
要创建权限和角色,并将权限添加到角色,可以使用以下代码示例
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'。
- 可选:将权限代码添加到策略和/或使用策略特质(见下面的策略特质)
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; } }
- 可选:通过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'。