php用户权限分配方法,PHP Laravel框架用户权限管理,按钮级别控制

环境配置:

语言:php

框架:Laravel 5.8

主要技术:Zizaco/Entrust扩展包,MySQL,PHP,Composer

扩展包名称:

Zizaco/Entrust

安装配置:

// 1. 在项目根目录运行

composer require zizaco/entrust

// 2. 在config/App.php文件 [providers]数组中添加一项:

ZizacoEntrustEntrustServiceProvider::class,

// 3. 在config/app.php文件 [aliases]数组中添加一项:

'Entrust' => ZizacoEntrustEntrustFacade::class,

// 4. 生成迁移文件(这一步之前必须配置好数据库连接)

php artisan entrust:migration

// 5. 运行迁移文件

php artisan migrate

// 可能报错如下:

IlluminateDatabaseQueryException : SQLSTATE[42000]:

Syntax error or access violation: 1071 Specified key was too long;

max key length is 1000 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

// 解决方式:在 app/Providers/AppServiceProvider.php文件 【boot】方法中 添加:

Schema::defaultStringLength(191);

// 6. 这时数据库中会创建4个表

1. permissions -----------权限表

2. permission_role ------ 权限角色关系表

3. roles ------------------ 角色表

4. role_user ------------- 角色用户关系表

// 7. 在用户表模型中添加:

// ...省略多余代码

use ZizacoEntrustTraitsEntrustUserTrait;

class User extends Authenticatable

{

use EntrustUserTrait;

use Notifiable;

// ...省略多余代码

}

// 8. 创建表模型,在项目根目录运行

php artisan make:model Model/Role

php artisan make:model Model/Permission

至此;配置部分完毕!

创建数据、模拟用户登陆

创建角色 (创建两个角色,后期测试会用到)

public function createRoles()

{

// 创建第一个角色

$roleModel = new Role();

$roleModel->name = 'admin'; //角色名称

$roleModel->display_name = '管理员'; //角色可读名称

$roleModel->save();

// 创建第二个角色

$roleModel = new Role();

$roleModel->name = 'ordinary'; //角色名称

$roleModel->display_name = '普通用户'; //角色可读名称

$roleModel->save();

}

//roles表->得到 admin ID 为1,ordinary ID为2

5e802b79c0e1f8a6f5713afdfc8bf085.png

Table roles 数据

创建权限(可细分的权限)

// 创建权限

public function createPermissions()

{

// 创建第一个权限

$permissionModel = new Permission();

$permissionModel->name = 'btn_display'; //权限名称

$permissionModel->display_name = '按钮可见'; //权限可读名称

$permissionModel->save();

// 创建第二个权限

$permissionModel = new Permission();

$permissionModel->name = 'menu_display'; //权限名称

$permissionModel->display_name = '菜单可见'; //权限可读名称

$permissionModel->save();

}

// permissions表->得到 btn_display ID为1 menu_display ID为2

db1b7b2bea2662e20e837f1b6920739b.png

Table permissions 数据

为角色分配权限

public function setRolesPerm()

{

// 1. 设置 admin 角色权限

// 获取角色ID

$user_id = Role::where('name', 'admin')->first(['id']);

// 获取所有权限,让admin拥有所有权限

$permissions = Permission::get(['id']);

// 向 permission_role 表中写入数据

foreach ($permissions as $per) {

DB::table('permission_role')->insert([

'permission_id' => $per->id,

'role_id' => $user_id->id,

]);

}

// 1. 设置 ordinary 角色权限

// 获取角色ID

$user_id = Role::where('name', 'ordinary')->first(['id']);

// 获取所有权限,让ordinary只拥有按钮可见权限

$permissions = Permission::where('name', 'btn_display')->first(['id']);

// 向 permission_role 表中写入数据

DB::table('permission_role')->insert([

'permission_id' => $per->id,

'role_id' => $user_id->id,

]);

}

444b3bbdc4278c554a2f25ab2b7e5b05.png

Table permission_role 数据

创建用户

public function createUser()

{

$userModel = new User();

$userModel->name = 'admin';

$userModel->email = '1234567@qq.com';

$userModel->password = '123456'; //未做加密处理,生产环境请做加密

$userModel->save();

$userModel = new User();

$userModel->name = 'test';

$userModel->email = '123456789@qq.com';

$userModel->password = '123456'; //未做加密处理,生产环境请做加密

$userModel->save();

}

6df675325b954d4b6923bc287834c3be.png

Table users 数据

为用户分配角色组

public function setUserRole()

{

// 1. 赋予 admin 用户 admin 角色

$user_info = User::where('name', 'admin')->first();

$role_info = Role::where('name', 'admin')->first();

$user_info->attachRole($role_info);

// 1. 赋予 test 用户 ordinary 角色

$user_info = User::where('name', 'test')->first();

$role_info = Role::where('name', 'ordinary')->first();

$user_info->attachRole($role_info);

}

如遇报错:Class 'AppRole' not found

这是命名空间的问题,两种解决办法:

1.把Role.php、Permission.php和用户表模型User.php 命名空间改为 App

2.根据路径 /vendor/zizaco/entrust/src/config.php

将return的数组键为'role'的值改为项目中Role.php实际命名空间

键'user'、'permission'同理 ,便可解决

79ffeeb8cff498ce44d6f70eea2d2ea5.png

Table role_user 数据

登陆

public function Login()

{

// 此处应接受前端数据进行验证

// 这边不再赘述 直接模拟登陆

// 用户 admin 登陆

$user_info = User::where('name', 'admin')->first();

// 用户 test 登陆

// $user_info = User::where('name', 'test')->first();

// 将用户信息存入Session

session(['user_info' => $user_info]);

return view('index');

}

至此,测试所需数据全部创建完毕

权限的使用

根据上面设置的角色组的权限建立测试html(index.blade.php)

权限测试

@if(session('user_info')->can('menu_display'))

菜单

@endif

@if(session('user_info')->can('btn_display'))

按钮

@endif

用户 admin 拥有所有权限,登陆之后,应当显示【菜单】以及【按钮】,如下图:

897f6b4ed33f516878fba968e6a724f4.png

用户 admin 登陆页面显示情况

用户 test 只拥有 【菜单可见】权限,应当只显示菜单,如下图:

336f447809f50cd256e29a5216302fc7.png

用户 test 登陆页面显示情况

后端对于角色的判断,不同角色执行不同代码

public function judgeRoles()

{

// 拥有 admin 角色的用户执行

if (session('user_info')->hasRole('admin')) {

// 业务代码

return 'admin角色业务代码执行完毕';

}

// 拥有 ordinary 角色的用户执行

if (session('user_info')->hasRole('ordinary')) {

// 业务代码

return 'ordinary角色业务代码执行完毕';

}

至此;关于PHP权限设置就完成了

以上都为测试学习代码,实际生产环境中还需要根据业务需求对代码进行修改整合,但是基础的权限设计功能已经实现。

谢谢!

最后的话:

如果各位大佬有什么更好的方法,请评论或私信我,我会及时回复的,欢迎各位大佬一起来探讨技术。

如果各位感觉我的文章对您有帮助的话,请您不要吝啬您的点赞!

祝大家技术一节更比一节高!