当前位置: 首页 > news >正文

TP5前后端分离RBAC权限管理API

TP5前后端分离RBAC权限管理API

  • 1.创建配置项目
  • 2.管理员功能
    • 2.1登录验证
    • 2.2.返回分页数据
    • 2.3增删改功能
  • 3.角色功能
  • 3.权限管理
  • 4.给管理员分配角色
  • 5.给角色分配权限
  • 6.导航菜单功能

坑神的博客文章可以参考,还可以和他交流请教,坑神人很nice!

1.创建配置项目

1.创建项目
我用的是phpstudy和composer,在phpstudy的www目录下运行cmd,然后创建5.1的tp框架,创建名是rbac

composer create-project topthink/think=5.1.* rbac

2.设置项目

  1. 普通设置:'app_debug' => true, 'app_trace'=> true。这里我做API模块,所以方便起见可以设置默认入口文件。
  2. 数据库设置:database.php配置数据库信息。
  3. 域名设置:在phpstudy和hosts里面设置域名。
  4. 在项目目录下cmd:php think make:controller api/Login创建api模块下Login控制器。

2.管理员功能

2.1登录验证

1.首先前后端分离需要解决跨域问题,所以建一个Cross控制器,api控制器之后继承它。

php think make:controller api/Cross
<?phpnamespace app\api\controller;use think\Controller;
use think\Request;class Cross extends Controller
{protected function initialize(){parent::initialize();header('Access-Control-Allow-Origin:*');header('Access-Control-Allow-Methods:GET, POST, OPTIONS,PUT, DELETE');header('Access-Control-Allow-Headers:Origin,X-Requested-With,Content-Type,token,Accept,x-access-sign,x-access-time');if (request()->isOptions()) {exit();}}
}
class Login extends Cross

2.jwt(JSON Web Token)登录
首先创建model

php think make:model AdminModel
<?phpnamespace app\common\model;use think\Model;class AdminModel extends Model
{protected $table='admin';#表名
}

连接数据库表:在login的controller中

use app\common\model\AdminModel;
$db=new AdminModel();

引入JWT进行登录验证

composer require firebase/php-jwt
<?phpnamespace app\api\controller;
use app\common\model\AdminModel;
use \Firebase\JWT\JWT;
use think\Controller;
use think\Request;class Login extends Cross
{public function index(Request $request){$data=$request->param();$db=new AdminModel();$info=$db->where('username',$data['username'])->find();if(!$info){return json(['code' => 0, 'msg' =>'账号不存在']);}if($info['password']!=$data['password']){return json(['code' => 0, 'msg' =>'账号或者密码不存在']);}$jwt=new JWT();$payload=['iss'=>'rbac','aud'=>'rbac',"iat" => time(),  // token 的创建时间"nbf" =>  time(),  // token 的生效时间"exp" => time() + 3600,  // token 的过期时间'aid'=>$info['id']];$key='key';$keyId = "keyId";$token=$jwt::encode($payload,$key,"HS256",$keyId);// dump($token);return json(['code' => 1, 'msg' =>$token]);}}

3.解析token

php think make:controller api/Base --plain#Base控制器只建一个初始化方法,然后这个Base类也要继承Cross实现跨域请求

这个算是一个中间件,初始化请求的token内容,从token里面获取uid信息。

<?phpnamespace app\api\controller;use think\Controller;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class Base extends Cross
{public function initialize(){parent::initialize();$header = request()->header();if (!isset($header['token'])){return json(['code'=>0,'msg'=>'请先登录'])->send();}if(empty($header['token'])){return json(['code'=>0,'msg'=>'请先登录'])->send();}$key = new Key('key', 'HS256');$info = JWT::decode($header['token'], $key);$this->aid=$info->aid;#token验证通过,将token里的uid拿到。// return json(['code'=>1,'token'=>$info])->send();}
}

4.请求路由控制器继承上面的base,就可以拿到用户id,然后进行权限验证

php think make:controller api/v1/Admin
<?phpnamespace app\api\controller\v1;
use app\common\model\AdminModel;
use app\api\controller\Base;
use think\Request;class Admin extends Base
{public function index(){$aid=$this->aid;$db=new AdminModel();$admininfo=$db->where('id',$aid)->find();#通过uid拿到这个用户的信息dump($admininfo);die();}
}

2.2.返回分页数据

通过$db->limit($limit)->page($page)->field($field)->select();即可获得指定页数据。

public function index(Request $request){$limit=$request->param('limit')?$request->param('limit'):10;$page=$request->param('page')?$request->param('page'):1;$db=new AdminModel();$field='id,username,create_time';$list=$db->limit($limit)->page($page)->field($field)->select();if ($list){$count=$db->count('id');return json(['code'=>1,'msg'=>'获取成功','data'=>$list,'total'=>$count]);}else{return json(['code'=>0,'msg'=>'暂无数据']);}}

2.3增删改功能

public function save(Request $request)//修改和增加功能{$data=$request->param();// dump($data);die();$db=new AdminModel();if (isset($data['id']) && !empty($data['id'])){//有id,修改功能$info=$db->where('id',$data['id'])->find();// dump($info);die();if (isset($data['password'])&& !empty($data['password'])){//要修改密码if ($info['password']===md5($data['password'])){$data['password']=$info['password'];}else{$data['password']=md5($data['password']);}}$res=$db->save($data,['id'=>$info['id']]);//修改对象}else{//无id,添加功能$data['password']=md5($data['password']);//密码加密后再存到数据库$res=$db->save($data);//添加对象}if($res){return json(['code'=>1,'msg'=>'操作成功']);}else{return json(['code'=>0,'msg'=>'操作失败']);}}public function delete(Request $request)//删除功能{$id=$request->param('id');$db=new AdminModel();if ($id==1){//没有删除权限return json(['code'=>0,'msg'=>'此用户不能删除']);}$res=$db->where('id',$id)->delete();if ($res){return json(['code'=>1,'msg'=>'操作成功']);}else{return json(['code'=>0,'msg'=>'操作失败']);}}

3.角色功能

1.创建模型和控制器

php think make:controller api/v1/Role
php think make:model RoleModel

2.创建数据库并在模型里连接到数据库

<?php
namespace app\common\model;
use think\Model;
class RoleModel extends Model
{protected $table='role';
}

3.在controller里面写功能
3.1分页功能

public function index(Request $request){$limit=$request->param('limit')?$request->param('limit'):10;$page=$request->param('page')?$request->param('page'):1;$db=new RoleModel();$list=$db->where('status',1)->limit($limit)->page($page)->select();if(!$list->isEmpty()){$count=$db->where('status',1)->count('id');return json(['code'=>1,'msg'=>'获取成功','data'=>$list,'total'=>$count]);}else{return json(['code'=>0,'msg'=>'暂无数据']);}}

3.2增删改功能

 public function save(Request $request){if (!$request->isPost()){return json(['code'=>0,'msg'=>'操作失败']);}$data=$request->param();$db=new RoleModel();if(isset($data['id'])&&!empty($data['id'])){$res=$db->save($data,['id'=>$data['id']]);}else{$res=$db->save($data);}if ($res){return json(['code'=>1,'msg'=>'操作成功']);}else{return json(['code'=>0,'msg'=>'操作失败']);}}public function delete(Request $request){$id=$request->param('id');$db=new RoleModel();$res=$db->where('id',$id)->delete();if ($res){return json(['code'=>1,'msg'=>'操作成功']);}else{return json(['code'=>0,'msg'=>'操作失败']);}}

3.权限管理

1.创建模型和控制器

php think make:controller api/v1/Rule
php think make:model RuleModel

2.创建数据库并在模型里连接到数据库

<?php
namespace app\common\model;
use think\Model;
class RuleModel extends Model
{protected $table='rule';
}

3.在controller里面写功能分页查询和增删改功能。

4.给管理员分配角色

1.创建模型(一对多的中间表)和控制器

php think make:controller api/v1/RoleAssign
php think make:model AdminRoleModel
<?php
namespace app\common\model;
use think\Model;
class AdminRoleModel extends Model
{protected $table='admin_role';
}

2.在控制器里进行增改查工作。

public function save(Request $request)//增改admin的role{$admin_id=$request->param('admin_id');$role_id=$request->param('role_id');$db=new AdminRoleModel();$info=$db->where('admin_id',$admin_id)->find();//如果admin——id存在就是修改用户角色表,否则是增加if($info){$res=$db->where('id',$info['id'])->setField('role_id',$role_id);}else{$data['admin_id']=$admin_id;$data['role_id']=$role_id;$res=$db->save($data);}if ($res){return json(['code'=>1,'msg'=>'操作成功']);}else{return json(['code'=>0,'msg'=>'操作失败']);}}public function read(Request $request)//根据id查看它的role有哪些{$admin_id=$request->param('admin_id');$db=new AdminRoleModel();$info=$db->where('admin_id',$admin_id)->find();$db=new RoleModel();$list=$db->where('status',1)->field('id,name')->select();if($info){$tmp=explode(',',$info['role_id']);#如果$info['role_id']的值为"1,2,3",那么$tmp的值就会是一个数组:["1", "2", "3"]foreach($list as $k=>$v){if(in_array($v['id'],$tmp)){$list[$k]['check']=true;}else{$list[$k]['check']=false;}}}else{foreach($list as $k=>$v){$list[$k]['check']=false;}}return json(['code'=>1,'data'=>$list]);}

5.给角色分配权限

1.创建模型(一对多的中间表)和控制器

php think make:controller api/v1/RoleRule
php think make:model RoleRuleModel
<?php
namespace app\common\model;
use think\Model;
class RoleRuleModel extends Model
{protected $table='role_rule';
}

2.在控制器里进行增改查工作(同上)。

6.导航菜单功能

相关文章:

TP5前后端分离RBAC权限管理API

TP5前后端分离RBAC权限管理API 1.创建配置项目2.管理员功能2.1登录验证2.2.返回分页数据2.3增删改功能 3.角色功能3.权限管理4.给管理员分配角色5.给角色分配权限6.导航菜单功能 坑神的博客文章可以参考&#xff0c;还可以和他交流请教&#xff0c;坑神人很nice&#xff01; 1.…...

p-级数的上界(Upper bound of p-series)

积分判别法-The Integral Test https://math.stackexchange.com/questions/2858067/upper-bound-of-p-series https://courses.lumenlearning.com/calculus2/chapter/the-p-series-and-estimating-series-value/ 两个重要级数&#xff08;p级数和几何级数&#xff09; ht…...

QT如何打包

目录 1.windeployqt工具 2.工具位置 3.使用方法 4.注意事项 Qt Creator 默认以动态链接的方式生成可执行文件&#xff0c;该文件无法独立运行&#xff0c;必须为其提供所需的动态链接库。也就是说&#xff0c;只分享 Qt Creator 生成的可执行文件是不行的&#xff0c;必须将…...

【c语言】通讯录(动态版+文件+背景音乐)含源码

开饭了&#xff0c;之前写的通讯录&#xff0c;是否会有人觉得申请1000人的空间是不是有点用不上呀&#xff0c;怎么才能做到要多少申请多少个呢&#xff1f;&#xff1f;我们学完动态内存管理&#xff0c;和文件的相关操作&#xff0c;终于可以继续完善我们的通讯录了 船新版本…...

c#后端获实体类多列最大值

如何在一个返回一个实体求某些列的最大值&#xff0c;最小值&#xff0c;平均值&#xff0c;求和呢&#xff1f; 过去一直都是用的循环对比&#xff0c;没有进行归纳&#xff0c;或者就是最笨的办法 var demos new List<Demo>();foreach (var item in demos){var values…...

腾讯云国际轻量应用服务器使用流程是什么呢?

腾讯云国际轻量应用服务器怎么使用呢&#xff1f;下面一起来了解一下&#xff1a; 1. 熟悉轻量应用服务器基础知识 ①什么是轻量应用服务器 TencentCloud Lighthouse&#xff1f; ②轻量应用服务器与云服务器 CVM 的区别是什么&#xff1f; ③为什么选择轻量应用服务器&#xf…...

CentOS 8 非编译方式 yum 安装 FFmpeg

FFmpeg 是一套免费的开源计算机程序&#xff0c;它提供了录制、转换以及流化音视频的完整解决方案。FFmpeg 在 Linux 平台下开发&#xff0c;但它同样也可以在其它操作系统环境中编译运行&#xff0c;包括 Windows、Mac OS X 等。大多数文章都是说的ubuntu上如何安装&#xff0…...

【Linux命令详解 | ssh命令】 ssh命令用于远程登录到其他计算机,实现安全的远程管理

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 连接远程服务器2. 使用SSH密钥登录2.1 生成密钥对2.2 将公钥复制到远程服务器 3. 端口转发3.1 本地端口转发3.2 远程端口转发 4. X11转发5. 文件传输与远程命令执行5.1 文件传输5.1.1 从本地向远程传输文件5.1.2 …...

IP 地址监控工具

地址监控实用程序是一套 IP 工具&#xff0c;包括 IP 地址监控工具、流氓检测工具和 MAC 地址解析器&#xff0c;用于日常监控和管理 DNS 名称、IP和 MAC 地址。地址监控工具用于 IP监控&#xff0c;用于管理 DNS 名称、网络的 IP 和 MAC 地址&#xff0c;并跟踪 IP 地址。 IP…...

基于OpenCV的人脸识别和模型训练系统(万字详解)

前言 我们身边的人脸识别有车站检票&#xff0c;监控人脸&#xff0c;无人超市&#xff0c;支付宝人脸支付&#xff0c;上班打卡&#xff0c;人脸解锁手机。 人脸检测是人脸识别系统组成的关键部分之一&#xff0c;其目的是检测出任意给定图片中的包含的一个或多个人脸&#…...

Docker容器与虚拟化技术:Docker镜像创建、Dockerfile实例

目录 一、理论 1.Docker镜像的创建方法 2.Docker镜像结构的分层 3.Dockerfile 案例 4.构建Systemctl镜像&#xff08;基于SSH镜像&#xff09; 5.构建Tomcat 镜像 6.构建Mysql镜像 二、实验 1.Docker镜像的创建 2. Dockerfile 案例 3.构建Systemctl镜像&#xff08;…...

每天一道leetcode:646. 最长数对链(动态规划中等)

今日份题目&#xff1a; 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅当 b < c 时&#xff0c;数对 p2 [c, d] 才可以跟在 p1 [a, b] 后面…...

651页23万字智慧教育大数据信息化顶层设计及建设方案WORD

导读&#xff1a;原文《651页23万字智慧教育大数据信息化顶层设计及建设方案WORD》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 目录 一、 方案背景 1.1 以教育…...

Vue3 使用json编辑器

安装 npm install json-editor-vue3 main中引入 main.js 中加入下面代码 import "jsoneditor";不然会有报错&#xff0c;如jsoneditor does not provide an export named ‘default’。 图片信息来源-github 代码示例 <template><json-editor-vue class…...

centos7 docker离线安装教程

centos7 docker离线安装教程 离线安装包下载# docker离线安装时需要两个安装包&#xff1a;selinux包、docker包&#xff0c; 下载地址&#xff1a; https://download.docker.com/linux/centos/7/x86_64/stable/Packages/selinux包下载 https://download.docker.com/linux/…...

解决爬虫上下行传输效率问题的实用指南

嗨&#xff0c;大家好&#xff01;作为一名专业的爬虫程序员&#xff0c;我们经常会面临上下行传输效率低下的问题。在处理大量数据时&#xff0c;如果传输效率不高&#xff0c;可能会导致爬虫任务速度慢&#xff0c;甚至中断。今天&#xff0c;我将和大家分享一些解决爬虫上下…...

Vue2入门学习汇总

1.介绍及安装 1.1 介绍 Vue是一套构建用户界面的渐进式框架。Vue只关注视图层&#xff0c;采用自底向上增量开发的设计。Vue的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 学习vue之前主要掌握的知识&#xff1a;HTML、CSS、JavaScript、TypeScript …...

收支明细高效管理,轻松查看和统计时间段内的开销收支明细!

亲爱的用户们&#xff0c;您是否经常需要查看某一时间段内的所有开销和收支明细&#xff0c;并进行自动统计和分析&#xff1f;现在&#xff0c;我们为您带来一款智能财务管家&#xff0c;让您轻松管理财务&#xff01; 首先&#xff0c;我们要进入晨曦记账本主页面&#xff0…...

c++ 成绩统计

Q&#xff1a; 有一个二维表格数据&#xff0c;它的值全部是整数&#xff0c;其中存储了若干个选手参与5分钟汉字输入比赛的成绩。数据中每一行是一条记录&#xff0c;每条记录包含两个整数&#xff0c;第1个整数为选手编号&#xff0c;它应该是一个4位整数&#xff1b;第2个整…...

PostgreSQL-UDF用户自定义函数-扩展插件

目录 PostgreSQL-UDF用户自定义函数-扩展插件零、前置条件一、创建 .c 和 .sql 文件创建.c文件创建.sql文件 二、创建 .control 和 Makefile 文件创建 .control 文件创建 Makefile 文件 三、编译 & 链接四、psql&#xff08;或者其他PG backend&#xff09;中创建扩展 Post…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...