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

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

ccwgpt 2024-09-23 04:33 40 浏览 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权限设置就完成了

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

谢谢!

最后的话:

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

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

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

相关推荐

十分钟让你学会LNMP架构负载均衡(impala负载均衡)

业务架构、应用架构、数据架构和技术架构一、几个基本概念1、pv值pv值(pageviews):页面的浏览量概念:一个网站的所有页面,在一天内,被浏览的总次数。(大型网站通常是上千万的级别)2、u...

AGV仓储机器人调度系统架构(agv物流机器人)

系统架构层次划分采用分层模块化设计,分为以下五层:1.1用户接口层功能:提供人机交互界面(Web/桌面端),支持任务下发、实时监控、数据可视化和报警管理。模块:任务管理面板:接收订单(如拣货、...

远程热部署在美团的落地实践(远程热点是什么意思)

Sonic是美团内部研发设计的一款用于热部署的IDEA插件,本文其实现原理及落地的一些技术细节。在阅读本文之前,建议大家先熟悉一下Spring源码、SpringMVC源码、SpringBoot...

springboot搭建xxl-job(分布式任务调度系统)

一、部署xxl-job服务端下载xxl-job源码:https://gitee.com/xuxueli0323/xxl-job二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库三、启动...

大模型:使用vLLM和Ray分布式部署推理应用

一、vLLM:面向大模型的高效推理框架1.核心特点专为推理优化:专注于大模型(如GPT-3、LLaMA)的高吞吐量、低延迟推理。关键技术:PagedAttention:类似操作系统内存分页管理,将K...

国产开源之光【分布式工作流调度系统】:DolphinScheduler

DolphinScheduler是一个开源的分布式工作流调度系统,旨在帮助用户以可靠、高效和可扩展的方式管理和调度大规模的数据处理工作流。它支持以图形化方式定义和管理工作流,提供了丰富的调度功能和监控...

简单可靠高效的分布式任务队列系统

#记录我的2024#大家好,又见面了,我是GitHub精选君!背景介绍在系统访问量逐渐增大,高并发、分布式系统成为了企业技术架构升级的必由之路。在这样的背景下,异步任务队列扮演着至关重要的角色,...

虚拟服务器之间如何分布式运行?(虚拟服务器部署)

  在云计算和虚拟化技术快速发展的今天,传统“单机单任务”的服务器架构早已难以满足现代业务对高并发、高可用、弹性伸缩和容错容灾的严苛要求。分布式系统应运而生,并成为支撑各类互联网平台、企业信息系统和A...

一文掌握 XXL-Job 的 6 大核心组件

XXL-Job是一个分布式任务调度平台,其核心组件主要包括以下部分,各组件相互协作实现高效的任务调度与管理:1.调度注册中心(RegistryCenter)作用:负责管理调度器(Schedule...

京东大佬问我,SpringBoot中如何做延迟队列?单机与分布式如何做?

京东大佬问我,SpringBoot中如何做延迟队列?单机如何做?分布式如何做呢?并给出案例与代码分析。嗯,用户问的是在SpringBoot中如何实现延迟队列,单机和分布式环境下分别怎么做。这个问题其实...

企业级项目组件选型(一)分布式任务调度平台

官网地址:https://www.xuxueli.com/xxl-job/能力介绍架构图安全性为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;调度中心和执...

python多进程的分布式任务调度应用场景及示例

多进程的分布式任务调度可以应用于以下场景:分布式爬虫:importmultiprocessingimportrequestsdefcrawl(url):response=re...

SpringBoot整合ElasticJob实现分布式任务调度

介绍ElasticJob是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目ElasticJob-Lite和ElasticJob-Cloud组成。它通过弹性调度、资源管控、...

分布式可视化 DAG 任务调度系统 Taier 的整体流程分析

Taier作为袋鼠云的开源项目之一,是一个分布式可视化的DAG任务调度系统。旨在降低ETL开发成本,提高大数据平台稳定性,让大数据开发人员可以在Taier直接进行业务逻辑的开发,而不用关...

SpringBoot任务调度:@Scheduled与TaskExecutor全面解析

一、任务调度基础概念1.1什么是任务调度任务调度是指按照预定的时间计划或特定条件自动执行任务的过程。在现代应用开发中,任务调度扮演着至关重要的角色,它使得开发者能够自动化处理周期性任务、定时任务和异...

取消回复欢迎 发表评论: