radiatecode/laravel-permission-name-generator

Laravel 包,用于从路由名称生成权限名称

v0.4.2 2024-04-04 09:16 UTC

This package is auto-updated.

Last update: 2024-09-04 10:11:34 UTC


README

Latest Version on Packagist Total Downloads

此包可以从路由名称或资源生成权限名称。在许多应用中,我们创建静态的权限名称(例如:create-post,edit-post,delete-post)来检查用户的访问权限,使用此包可以帮助您动态地生成权限名称。权限名称可以根据面板生成。

升级说明:如果您升级到 v0.4,则需要升级较旧的 permission-generator 配置文件

要求

安装

您可以通过 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"

当您想自定义权限视图时,这可能很有用

用法

以下是一些路由

Stats

现在从这些路由获取权限名称

RadiateCode\PermissionNameGenerator\Permissions::make()->fromRoutes()->get();

输出

Permissions

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
    }
}

输出

PermissionTitle

权限追加示例

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);
    }
}

输出

PermissionTitle

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

权限视图 Stats

创建权限保存路由

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' => [
        // 
        //],
    ]
]

相同输出

Stats

或者,生成权限

此软件包允许你通过定义资源名称来生成权限名称。

示例

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)。有关更多信息,请参阅 许可证文件