系统:Linux
措辞:PHP
框架:Laravel 5.8
紧张技能:Zizaco/Entrust扩展包,MySQL,PHP,Composer
扩展包名称:
Zizaco/Entrust
安装配置:
// 1. 在项目根目录运行composer require zizaco/entrust// 2. 在config/app.php文件 [providers]数组中添加一项:Zizaco\Entrust\EntrustServiceProvider::class, // 3. 在config/app.php文件 [aliases]数组中添加一项:39;Entrust' => Zizaco\Entrust\EntrustFacade::class, // 4. 天生迁移文件(这一步之前必须配置好数据库连接) php artisan entrust:migration // 5. 运行迁移文件 php artisan migrate // 可能报错如下: Illuminate\Database\QueryException : 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 Zizaco\Entrust\Traits\EntrustUserTrait; 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
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
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, ]); }
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(); }
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 'App\Role' not found
这是命名空间的问题,两种办理办法:
1.把Role.php、Permission.php和用户表模型User.php 命名空间改为 App\
2.根据路径 /vendor/zizaco/entrust/src/config.php
将return的数组键为'role'的值改为项目中Role.php实际命名空间
键'user'、'permission'同理 ,便可办理
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)<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>权限测试</title></head>@if(session('user_info')->can('menu_display'))<h1>菜单</h1>@endif@if(session('user_info')->can('btn_display'))<button>按钮</button>@endif<body></body></html>
用户 admin 拥有所有权限,上岸之后,应该显示【菜单】以及【按钮】,如下图:
用户 admin 上岸页面显示情形
用户 test 只拥有 【菜单可见】权限,应该只显示菜单,如下图:用户 test 上岸页面显示情形
后端对付角色的判断,不同角色实行不同代码
public function judgeRoles() { // 拥有 admin 角色的用户实行 if (session('user_info')->hasRole('admin')) { // 业务代码 return 'admin角色业务代码实行完毕'; } // 拥有 ordinary 角色的用户实行 if (session('user_info')->hasRole('ordinary')) { // 业务代码 return 'ordinary角色业务代码实行完毕'; }
至此;关于PHP权限设置就完成了
以上都为测试学习代码,实际生产环境中还须要根据业务需求对代码进行修正整合,但是根本的权限设计功能已经实现。
感激!
末了的话:
如果各位大佬有什么更好的方法,请评论或私信我,我会及时回答的,欢迎各位大佬一起来磋商技能。
如果各位觉得我的文章对您有帮助的话,请您不要吝啬您的点赞!
祝大家技能一节更比一节高!