radiatecode / laravel-permission-name-generator
Laravel 包,用于从路由名称生成权限名称
Requires
- php: ^7.1|^8.0
Requires (Dev)
- orchestra/testbench: ^6.18
- phpunit/phpunit: ^9.5
README
此包可以从路由名称或资源生成权限名称。在许多应用中,我们创建静态的权限名称(例如:create-post,edit-post,delete-post)来检查用户的访问权限,使用此包可以帮助您动态地生成权限名称。权限名称可以根据面板生成。
升级说明:如果您升级到 v0.4,则需要升级较旧的 permission-generator 配置文件
要求
- PHP >= 7.1
- Laravel 5.7|6.x|7.x|8.x|9.x|10.x
- JQuery [用于视图]
- Bootstrap [用于视图]
安装
您可以通过 composer 安装此包
composer require radiatecode/laravel-permission-name-generator
发布配置文件
php artisan vendor:publish --provider="RadiateCode\PermissionNameGenerator\PermissionNameServiceProvider" --tag="permission-generator-config"
发布权限视图文件(可选)
php artisan vendor:publish --provider="RadiateCode\PermissionNameGenerator\PermissionNameServiceProvider" --tag="permission-views"
当您想自定义权限视图时,这可能很有用
用法
以下是一些路由
现在从这些路由获取权限名称
RadiateCode\PermissionNameGenerator\Permissions::make()->fromRoutes()->get();
输出
PermissionGenerator 特性 [可选]
如果您想在控制器中设置权限组标题、排除权限或将权限追加到另一个组,则该特性很有用。我们如何使用它,在控制器中实现 WithPermissionGenerator 协议,然后使用 PermissionGenerator 特性。
PermissionGenerator 特性中的可用方法
permissionsExclude(...$methods)
: 用于排除一个路由,使其不被生成为权限名称。permissionsTitle(string $title)
: 用于设置权限组标题permissionsAppendTo(string $key)
: 权限追加到另一个权限组
示例
use App\Http\Controllers\Controller; use RadiateCode\LaravelRoutePermission\Contracts\WithPermissionGenerator; use RadiateCode\LaravelRoutePermission\Traits\PermissionGenerator; class DepartmentController extends Controller implements WithPermissionGenerator { use PermissionGenerator; public function __construct() { $this->permissionsTitle('Department Crud Permissions') ->permissionsExclude('index');// index associate route won't be generated as permission names } }
输出
权限追加示例
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller\DepartmentController; use RadiateCode\LaravelRoutePermission\Contracts\WithPermissionGenerator; use RadiateCode\LaravelRoutePermission\Traits\PermissionGenerator; class DesignationController extends Controller implements WithPermissionGenerator { use PermissionGenerator; public function __construct() { $this->permissionsAppendTo(DepartmentController::class); } }
输出
PermissionGenerator 特性是可选的。因为如果没有定义权限组标题,则此包将根据控制器名称动态生成标题,可以在 配置 中排除路由,并且可以通过
custom-permission
配置 执行权限追加。
权限视图构建器
此包附带一个视图构建器,以有组织的方式显示生成的权限名称。
构建器中的可用方法
make(string $view, array $data = [])
: 设置您的视图。withPermissions(array $permissions)
: 传递生成的权限名称。markRolePermissions(string $roleName, arra $rolePermissions,string $permissionsSaveUrl = null)
: 此方法帮助您在视图中标记存储的角色权限,以便您可以识别哪些权限属于该角色,您可以在其中存储/更新角色权限的 URL 中定义render()
: 它渲染视图,包括预定义的数据($permissionCards,$permissionScripts),在 blade 中显示这些数据。请参阅下面的 blade 文件示例
可以通过
$request->get('permissions'); // array of permissions
权限视图示例
在控制器中
use RadiateCode\PermissionNameGenerator\Permissions; use RadiateCode\PermissionNameGenerator\Facades\PermissionsView; use App\Models\Role; class RoleController extends Controller { public function permissionsShow($id) { $role = Role::query()->findOrFail($id); // generate permissions from routes $permissions = Permissions::make()->fromRoutes()->get(); return PermissionsView::make('app.role.permissions') ->withPermissions($permissions) ->markRolePermissions( // helps to mark the stored role's permissions in the view $role->role_name, json_decode($role->role_permissions), // assume role permissions stored as json encoded route('create-role-permission', $role->id) // permission save url for a role )->render(); } }
在 app/role/permissions.blade.php 文件中
@extends('demo.layouts.app') @section('content') <div class="row"> <div class="col-12"> <div class="card card-dark"> <div class="card-header"> <h3 class="card-title">Role Permissions</h3> </div> <div class="card-body"> <!-- Comes from PermissionView Builder --> {!! $permissionCards !!} </div> </div> </div> </div> @endsection @push('js') <!-- Comes from PermissionView Builder --> {!! $permissionScripts !!} @endpush
创建权限保存路由
Route::post('/role/{id}/permissions/create',[RoleController::class,'permissionStore'])->name('create-role-permission');
use \Illuminate\Http\Request; class RoleController extends Controller { public function permissionStore(Request $request,$id) { $role = Role::find($id); $role->role_permissions = json_encode($request->get('permissions')); // get the submitted permissions $role->save(); return response()->json('success',201); } }
面板
可以为多个面板生成权限,例如一个应用程序可能有一个用户面板和一个管理员面板,它们可能需要不同的权限。我们可以通过定义多个面板来实现这一点,默认为'用户'面板,假设所有用户面板的权限。但如果你想为不同的面板生成不同的权限,你可以在配置中定义另一个面板。
获取自定义面板的权限名称。
RadiateCode\PermissionNameGenerator\Permissions::make()->panel('your_custom_panel_name')->fromRoutes()->get();
注意:面板仅适用于路由。
配置
配置 config/permission-generator.php 文件。
1. 分隔符
如果路由名称包含任何特殊字符,则使用该字符分隔名称。它将用于生成权限文本。例如,如果路由名称是 create.post,则权限文本将是 创建帖子。
'route-name-splitter-needle' => '.',
2. 自定义权限
你可以定义自定义的新权限,向现有权限添加额外的权限。你可以为自定义面板添加自定义权限。
'custom-permissions' => [ 'panels' => [ 'user' => [ // custom-permissions ], // 'admin' => [ // // custom-permission //], ] ],
示例
'custom-permissions' = [ 'panels' => [ 'user' => [ 'user-permission' => ['active-user','inactive-user'], 'bonus-permission' => [ [ 'name' => 'approve-own-department', 'text' => 'Approve Own Department' ], ] ], // 'admin' => [ // // custom-permission //], ] ]
注意:注意包含只有权限名称的
user-permission
键,如果没有传递 text 键,则动态为权限名称创建 text。你还可以向现有权限添加额外的权限,例如bonus-permission
是一个现有权限,我们向它添加自定义的approve-own-department
额外权限。
3. 权限生成控制器
此配置在生成权限方面起着至关重要的作用,因为权限仅生成定义为的控制器。权限名称将仅从定义为的控制器路由名称生成。默认情况下,权限名称将从用户面板的所有控制器路由生成。你可以定义自定义面板及其权限生成控制器。控制器可以是完全限定类名或命名空间前缀。
'permission-generate-controllers' => [ 'panels' => [ 'user' => [ 'App\Http\Controllers', // sample // 'App\Http\Controllers\Api', // App\Http\Controllers\DepartmentController::class, // App\Http\Controllers\DesignationController::class, ], // 'admin' => [ // 'App\Http\Controllers\Admin', //], ] ],
4. 排除路由
通过控制器排除路由。默认情况下,所有认证控制器的路由都将从用户面板的权限名称生成中排除。 控制器可以是完全限定类名或命名空间前缀。
'exclude-controllers' => [ 'panels' => [ 'user' => [ 'App\Http\Controllers\Auth', // exclude routes of all auth controllers // App\Http\Controller\Employee\EmployeeProfileController::class, ], // 'admin' => [ // 'App\Http\Controllers\Admin\Auth', //], ] ],
或者,我们可以通过路由名称排除路由
'exclude-routes' => [ 'panels' => [ 'user' => [ // sample 'register.user', 'employee.profile', .... .... ], // 'admin' => [ // route.name, //], ] ],
6. 缓存权限
缓存权限名称
'cache-permissions' => true,
7. 权限部分
权限可以根据部分进行分组,例如管理员部分、员工部分、设置部分等。
/** * Parmissions can be organised by section (ex: adminland, settings, employee managment etc) * * sample format: key as section name, value as generated permissions-title * [ * 'adminland' => [ * 'employee-permissions', * 'bonus-permissions' * ], * 'settings' => [ * 'office-permissions', * 'designation-permissions', * 'email-settings-permissions', * 'rules-permissions' * ], * ] */ 'permissions-section' => [ 'panels' => [ 'user' => [ // sample 'adminland' => [ 'users-permissions', // all the user permissions 'roles-permissions' // all the role permissions ], 'settings' => [ 'email-settings-permissions', // all the permissions of email settings DepartmentController::class, // all the permissions of department DesignationController::class, // all the permissions of designation OrganisationController::class // all the permissions of organisation ], ......, ......, ], // 'admin' => [ // //], ] ]
相同输出
或者,生成权限
此软件包允许你通过定义资源名称来生成权限名称。
示例
use RadiateCode\PermissionNameGenerator\Permissions; $permissions = Permissions::make()->fromResources([ 'users', 'posts', ])->get() // output [ 'users-permission' => [ [ 'name' => 'create-users', 'text' => 'Create Users' ], [ 'name' => 'edit-users', 'text' => 'Edit Users' ], [ 'name' => 'show-users', 'text' => 'Show Users' ], [ 'name' => 'delete-users', 'text' => 'Delete Users' ], [ 'name' => 'view-users', 'text' => 'View Users' ], ], 'posts-permission' => [ [ 'name' => 'create-posts', 'text' => 'Create Posts' ], [ 'name' => 'edit-posts', 'text' => 'Edit Posts' ], [ 'name' => 'show-posts', 'text' => 'Show Posts' ], [ 'name' => 'delete-posts', 'text' => 'Delete Posts' ], [ 'name' => 'view-posts', 'text' => 'View Posts' ], ] ]
想知道它是如何生成的,资源权限名称是使用在
config
文件中定义的操作来生成的。/** * These actions used to generate permissions on given resources * * [Ex: If resource is posts, then permission will be ('create-posts','edit-posts','view-posts') etc] */ 'resource-actions' => [ 'create', 'edit', 'show', 'delete', 'view', ]
我们还可以为资源添加额外的操作,这将生成额外的权限名称。
use RadiateCode\PermissionNameGenerator\Permissions; $permissions = Permissions::make()->fromResources([ 'users' => /*extra actions*/['delete-selected','active'], 'posts' // no extra actions ])->get(); // output [ 'users-permission' => [ [ 'name' => 'create-users', 'text' => 'Create Users' ], [ 'name' => 'edit-users', 'text' => 'Edit Users' ], [ 'name' => 'show-users', 'text' => 'Show Users' ], [ 'name' => 'delete-users', 'text' => 'Delete Users' ], [ 'name' => 'view-users', 'text' => 'View Users' ], [ // extra 'name' => 'delete-selected-users', 'text' => 'Delete Selected Users' ], [ // extra 'name' => 'active-users', 'text' => 'Active Users' ], ], 'posts-permission' => [ [ 'name' => 'create-posts', 'text' => 'Create Posts' ], [ 'name' => 'edit-posts', 'text' => 'Edit Posts' ], [ 'name' => 'show-posts', 'text' => 'Show Posts' ], [ 'name' => 'delete-posts', 'text' => 'Delete Posts' ], [ 'name' => 'view-posts', 'text' => 'View Posts' ], ], ]
权限视图构建器
示例
use RadiateCode\PermissionNameGenerator\Permissions; use RadiateCode\PermissionNameGenerator\Facades\PermissionsView; use App\Models\Role; class RoleController extends Controller { public function permissionsShow($id) { $role = Role::query()->findOrFail($id); $permissions = Permissions::make()->fromResources([ 'users', 'posts', 'comments' ])->get(); return PermissionsView::make('app.role.permissions') ->withPermissions($permissions) ->markRolePermissions( $role->role_name, json_decode($role->role_permissions), // assume role permissions stored as json encoded route('create-role-permission', $role->id) // permission save url for a role )->render(); } }
贡献
有关详细信息,请参阅 CONTRIBUTING。
安全
如果您发现任何安全相关的问题,请通过电子邮件 radiate126@gmail.com 而不是使用问题跟踪器。
致谢
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。