百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

ccwgpt 2024-09-23 04:33 42 浏览 0 评论

环境配置:

系统: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
至此;配置部分完毕!

创建数据、模拟用户登陆

  1. 创建角色 (创建两个角色,后期测试会用到)
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
  1. 创建权限(可细分的权限)
		// 创建权限
    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
  1. 为角色分配权限
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,
        ]);
    }
  1. 创建用户
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();
    }



  1. 为用户分配角色组
 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'同理 ,便可解决


  1. 登陆
 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');
    }

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

权限的使用

  1. 根据上面设置的角色组的权限建立测试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>
  1. 用户 admin 拥有所有权限,登陆之后,应当显示【菜单】以及【按钮】,如下图:


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



  1. 后端对于角色的判断,不同角色执行不同代码
public function judgeRoles()
    {
        // 拥有 admin 角色的用户执行
        if (session('user_info')->hasRole('admin')) {
            // 业务代码
            return 'admin角色业务代码执行完毕';
        }

        // 拥有 ordinary 角色的用户执行
        if (session('user_info')->hasRole('ordinary')) {
            // 业务代码
            return 'ordinary角色业务代码执行完毕';
      }

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

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

谢谢!

最后的话:

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

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

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

相关推荐

土豪农村建个别墅不新鲜 建个车库都用框架结构?

农村建房子过去都是没车库,也没有那么多豪车,一般直接停在路边或者院子里。现在很多人都会在建房子的时候留一个车库,通过车库可以直接进入客厅,省得雨雪天气折腾。农村土豪都是有钱任性,建房子跟我们普通人不一...

自建框架结构出现裂缝怎么回事?

三层自建房梁底与墙体连接处裂缝是结构问题吗?去前帮我姑画了一份三层自建房的图纸,前天他们全部装修好了。我姑丈突然打电话给我说他发现二层的梁底与墙分离了,有裂缝。也就是图纸中前面8.3米那跨梁与墙体衔接...

钢结构三维图集-框架结构(钢柱对接)

1、实腹式钢柱对接说明1:1.上节钢柱的安装吊点设置在钢柱的上部,利用四个吊点进行吊装;2.吊装前,下节钢柱顶面和本节钢柱底面的渣土和浮锈要清除干净,保证上下节钢柱对接面接触顶紧;3.钢柱吊装到位后...

三层框架结构主体自建房设计案例!布局13*12米占地面积156平米!

绘创意设计乡村好房子设计小编今日头条带来分享一款:三层框架结构主体自建房设计案例!布局13*12米占地面积156平米!本案例设计亮点:这是一款三层新中式框架结构自建房,占地13×12米,户型占地面积...

Casemaker机箱框架结构3D图纸 STEP格式

农村自建房新宠!半框架结构凭啥这么火?内行人揭开3个扎心真相

回老家闲逛,竟发现个有意思的现象:村里盖新房,十家有八家都选了"半框架结构"。隔壁王叔家那栋刚封顶的二层小楼,外墙红砖还露着糙面没勾缝,里头的水泥柱子倒先支棱得笔直,这到底是啥讲究?蹲...

砖混结构与框架结构!究竟有何区别?千万别被坑!

农村自建房选结构,砖混省钱但出事真能保命吗?7月建材价格波动期,多地建房户因安全焦虑陷入选择困境——框架结构虽贵30%,却是地震区保命的关键。框架柱和梁组成的承重体系,受力分散得像一张网。砖混靠墙硬扛...

砖混结构与框架结构,究竟有何区别?千万别被坑!

农村建房选砖混结构还是框架结构?这个问题算是近期留言板里问得最多的问题了。今天咱们说说二者的区别,帮您选个合适的。01成本区别假如盖一栋砖混结构的房子需要30万,那么换成框架结构,一般要多掏30%的费...

6个小众却逆天的App神器,个个都是黑科技的代表

你的手机上有哪些好用的软件?今天我就给大家分享6个小众却逆天的App神器,个个都是黑科技的代表!01*Via浏览器推荐理由:体积极小的浏览器,没有任何广告。使用感受:它的体量真的很小,只有702KB,...

合肥App开发做一个app需要多少钱?制作周期有多久?

在移动互联网时代,开发一款APP已成为企业数字化转型与个人创业的重要途径。然而,APP的开发成本与制作周期受功能复杂度、技术架构、团队类型等多重因素影响,差异极大。好牛软件将从这两个维度展开分析,帮助...

详解应对App臃肿化的五大法则

编者注:本文转自腾讯ISUX。先来看一张图:图上看到,所有平台上用户花费时间都在减少,除了移动端。观察身边也是如此,回家不开电脑的小伙伴越来越多。手机平板加电视,下班场景全搞定。连那些以前电脑苦手的...

实战!如何从零搭建10万级 QPS 大流量、高并发优惠券系统

需求背景春节活动中,多个业务方都有发放优惠券的需求,且对发券的QPS量级有明确的需求。所有的优惠券发放、核销、查询都需要一个新系统来承载。因此,我们需要设计、开发一个能够支持十万级QPS的券系...

8种移动APP导航设计模式大对比

当我们确定了移动APP的设计需求和APP产品设计流程之后,开始着手设计APP界面UI或是APP原型图啦。这个时候我们都要面临的第一个问题就是如何将信息以最优的方式组合起来?也许我们对比和了解了其他一些...

数字资产支付 App 的技术框架

开发一款功能强大、安全可靠的数字资产支付App需要一个整合了区块链技术、后端服务、前端应用以及第三方集成的全栈技术框架。这个框架的核心在于保障数字资产的安全流通,并将其高效地桥接到传统的法币支付场...

从MyBatis到App架构:设计模式全景应用指南

从MyBatis到App架构:设计模式全景应用指南引言在企业级应用和服务端开发领域,MyBatis凭借其灵活、简洁、强大的ORM映射能力被广泛应用。而它之所以能拥有如此优秀的可扩展性和工程可维护性,正...

取消回复欢迎 发表评论: