龙空技术网

PHP Laravel框架用户权限管理,按钮级别控制(详细)

GhostOfCode 604

前言:

如今你们对“php按钮代码”大约比较看重,看官们都需要剖析一些“php按钮代码”的相关资讯。那么小编也在网络上网罗了一些对于“php按钮代码””的相关知识,希望朋友们能喜欢,小伙伴们快快来学习一下吧!

环境配置:

系统: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]数组中添加一项:'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权限设置就完成了

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

谢谢!

最后的话:

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

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

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

标签: #php按钮代码