laravel的权限管理api

  • Post author:
  • Post category:其他




一、权限管理



1.1 安装权限组件及配置

运行

运行命令:

composer require spatie/laravel-permission


在这里插入图片描述


文档基础介绍


运行命令

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

生成迁移文件:

在这里插入图片描述

在这里插入图片描述




2021_08_30_195803_create_permission_tables.php

中增加两个字段,用来展示权限中文名称:

在这里插入图片描述

输入命令:

php artisan migrate

生成相关的表:

在这里插入图片描述

在这里插入图片描述

可以看到生成了很多跟权限相关的表。


运行命令

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

生成配置信息。

在这里插入图片描述




User

模型进行调整:

在这里插入图片描述



1.2 创建权限填充文件(角色、权限)

和菜单、商品一样,我们权限也是用数据填充的方式,将现有基础的权限填充,而不是一个个手动录入,后期根据管理员的需求自己也可以手动录入。

在这里插入图片描述

权限名字需要唯一,刚好路由名字也是唯一,采用路由名字,针对那些我们自己定义的路由,没有路有别名,我们采用,自己手动写入路由别名:

在这里插入图片描述

其他的类似。


运行命令:

php artisan make:seeder PermissionSeeder


在这里插入图片描述

写入(写一组用户的,其他的类似):

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class PermissionSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // 添加之前情况缓存
        app()['cache']->forget('spatie.permission.cache');

        // 添加权限
        $permissions = [
            // 权限名字需要唯一,刚好路由名字也是唯一,采用路由名字
            ['name' => 'users.index', 'cn_name' => '用户列表', 'guard_name' => 'api'],
            ['name' => 'users.show', 'cn_name' => '用户详情', 'guard_name' => 'api'],
            ['name' => 'users.lock', 'cn_name' => '用户禁用启用', 'guard_name' => 'api'],
            // ...有时间再补全,以及补全自定义路由的别名。

        ];

        // 添加权限
        foreach($permissions as $p) {
            Permission::create($p);
        }

        // 添加角色
        $role = Role::create(['name' => 'rootadmin', 'cn_name' => '超级管理', 'guard_name' => 'api']);

        // 为角色添加权限 所有权限给到超级管理员
        $role->givePermissionTo(Permission::all());
    }
}

运行填充命令:

php artisan db:seed --class=PermissionSeeder


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以看到角色表和权限表以及角色关联权限表的数据都一一对应。




1.3 创建用户填充文件

运行命令

php artisan make:seed UserSeeder


在这里插入图片描述

写入代码:

<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // 创建用户
        $user = User::create([
            'name' => '超级管理员',
            'email' => 'super@a.com',
            'password' => bcrypt('123456')
        ]);

        // 给用户分配角色
        $user->assignRole('rootadmin');
    }
}

运行命令

php artisan db:seed --class=UserSeeder

执行填充文件:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以看到

id

为7的用户角色

role_id

为1既超级管理员,超级管理员又具备这么多权限。


可以看到填充文件如果很多的话,我们每个都要去写,所以我们可以写在

DatabaseSeeder.php

中:

在这里插入图片描述

所以我们运行多个填充文件时只需要运行一次命令:

php artisan db:seed

默认执行

DatabaseSeeder.php



1.4 验证权限(测试)

使用我们分配的超级管理员账号去登陆:

在这里插入图片描述

将获取到的

token



postman

中替换:

在这里插入图片描述


运行命令

php artisan make:middleware CheckPermission

创建中间件用来测试用户是否有权限:

在这里插入图片描述

写入:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckPermission
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        // dd($request->route()->getName());
        /**
         * 检查用户权限,验证用户是否有权限
         */ 
        // 获取用户信息
        $user = auth('api') -> user();

        if (!$user->can($request->route()->getName())) {
            abort(403);
        }

        return $next($request);
    }
}

中间配置完之后在

Http/Kernel.php

中配置:

 'check.permission' => \App\Http\Middleware\CheckPermission::class,

在这里插入图片描述




admin.php

路由增加中间件:

在这里插入图片描述


测试:

在这里插入图片描述

在这里插入图片描述

可以看到有权限的正常返回,没有权限的403。

在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。



版权声明:本文为weixin_44103733原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。