Laravel 使用:laravel-premission

laravel-permission,可以方便的搭建基于 `RBAC` 的用户角色权限管理系统。composer require spatie/laravel-permission, $permission->assignRole($role),$role->syncPermissions($permissions);

hefengbao 发布于 2023.03.27 ,最后更新于 2023.09.18

Laravel premission ,可以方便的搭建基于 RBAC 的用户角色权限管理系统。

GitHub: https://github.com/spatie/laravel-permission 文档:https://spatie.be/docs/laravel-permission/v5/introduction

安装

composer require spatie/laravel-permission

发布数据库迁移文件和 config/permission.php 配置文件:

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
 Copying file [vendor/spatie/laravel-permission/config/permission.php] to [config/permission.php] ........... DONE
  Copying file [vendor/spatie/laravel-permission/database/migrations/create_permission_tables.php.stub] to [database/migrations/2023_03_26_071308_create_permission_tables.php]
php artisan migrate

其中 permissionsroles 字段是一样的,其中 name 字段用于保存权限或角色,比如我们创建一个 user:edit 的权限,如果需要添加描述 编辑用户,则当前的设计不满足需求,因此可以在 2023_03_26_071308_create_permission_tables.php 文件中根据需求添加字段,:

Schema::create($tableNames['permissions'], function (Blueprint $table) {
          
		$table->string('name');  
		$table->string('display_name');
		 ...
});

Schema::create($tableNames['roles'], function (Blueprint $table) use ($teams, $columnNames) {

		$table->string('name'); 
		$table->string('display_name');
		...
});

使用

1、在 User 模型中添加 trait:

<?php
namespace App\Models;

use Spatie\Permission\Traits\HasPermissions;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable, HasRoles, HasPermissions;
	}

2、创建权限

php artisan make:controller PermissionController --resource
<!-- routes/web.php -->
Route::resource('/permissions', \App\Http\Controllers\PermissionController::class);
<?php

namespace App\Http\Controllers;

use Spatie\Permission\Models\Permission;

class PermissionController extends Controller
{
    public function create()
    {
        Permission::create([
            'name' => 'post:create',
            'display_name' => '写文章'
        ]);
				
				Permission::create([
            'name' => 'post:edit',
            'display_name' => '编辑文章'
        ]);
    }

3、创建角色

php artisan make:controller RoleController --resource
<!-- routes/web.php -->
Route::resource('/roles', \App\Http\Controllers\RoleController::class);
<?php

namespace App\Http\Controllers;

use Spatie\Permission\Models\Role;

class RoleController extends Controller
{
    public function create()
    {
        Role::create([
            'name' => 'editor',
            'display_name' => '编辑'
        ]);
    }

4、给权限绑定角色/给角色分配权限

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class PermissionController extends Controller
{
  
    public function roles(Request $request){
        $permission = Permission::where('name', 'poser:create')->first();

        $role = Role::where('name', 'editor')->first();

        $permission->assignRole($role);
    }
}

或者

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class RoleController extends Controller
{
    public function permissions(Request $request)
    {
        $permission = Permission::where('name', 'poser:create')->first();

        $role = Role::where('name', 'editor')->first();

        $role->givePermissionTo($permission);
    }
}

可以给角色一次分配多个权限或者给权限一次绑定多个角色:

$role->syncPermissions($permissions);
$permission->syncRoles($roles);

参考文档了解。

5、给用户分配角色

<?php

namespace App\Http\Controllers;

use App\Models\Profile;
use App\Models\Role;
use App\Models\User;

class UserController extends Controller
{
    public function roles(Request $request){
        /** @var User $user */
        $user = User::find(1);

        $user->assignRole(['editor']);
    }
}

6、权限判断

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use App\Models\User;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function create(Request $request)
    {
        /** @var User $user */
        $user = $request->user();

        if (!$user->hasAnyPermission('post:create')){
            abort(403, '您没有权限');
        }
    }

7、定义超级管理员(Super-Admin)

一般情况下,默认超级管理员拥有全部权限。

use Illuminate\Support\Facades\Gate;

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerPolicies();

        Gate::before(function ($user, $ability) {
            return $user->hasRole('SuperAdmin') ? true : null;
        });
    }
}

更多细节请参考文档。

Laravel    Laravel   Laravel 入门   RBAC  

hefengbao

暂无个人简介

有0条评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

来源:

https://www.8ug.icu/articles/laravel-tutorial-laravel-premission-OZDb4pbWN2