一、权限管理
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的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。