当前位置: 首页 > 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…...

接口测试及接口抓包常用测试工具和方法?

作为测试领域中不可或缺的一环&#xff0c;接口测试和抓包技术在软件开发过程中扮演着至关重要的角色。不论你是新手还是有一些经验的小伙伴&#xff0c;本篇文章都会为你详细介绍接口测试的基本概念、常用测试工具和实际操作技巧&#xff0c;让你轻松掌握这一技能。 接口测试…...

C语言入门_Day 6布尔数与比较运算

目录 前言 1.布尔数 2.比较运算 3.易错点 4.思维导图 前言 除了算术计算以外&#xff0c;编程语言中还会大量使用比较运算&#xff0c;并会根据比较运算的结果是“真”还是“假”&#xff0c;来执行不同的代码。 当你想买一杯奶茶&#xff0c;准备支付的时候&#xff0c;支…...

Java中的JDBC

什么是JDBC 1.Java数据库连接技术(Java DataBase Connectivity)&#xff0c;能实现Java程序对各种数据库的访问 2.由一组使用Java语言编写的类和接口(JDBC API)组成&#xff0c;它们位于java.sql以及javax.sql中 JDBC访问数据库的步骤&#xff1a; 步骤 1.Class.forName()加载…...

Vue 安装开发者工具

1.下载开发者工具&#xff0c;下载地址&#xff1a;http://book.wiyp.top/App/Vue3开发者工具-谷歌/Vue3.crx 2.打开谷歌浏览器&#xff0c;点击扩展&#xff0c;点击管理扩展程序。 3.开启开发者模式&#xff0c;将 Vue3 开发者工具文件拖拽到浏览器中进行安装。 注&#xff…...

oracle修改临时表出现已使用的事务正在处理临时表问题

错误提示&#xff1a; ORA-14450:试图访问已经在使用的事务处理临时表 解决方法&#xff1a; 通过第一句sql来查找临时表的object_id &#xff0c;然后代入第二局sql来生成第三句sql语句。 最后再执行第三句sql语句即可kill session&#xff0c;执行修改表的操作。 SELECT * F…...

RestTemplate

RestTemplate介绍 RestTemplate是Spring提供的用于访问RESTful服务的客户端&#xff0c;RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。RestTemplate默认依赖JDK提供http连接的能力&#xff08;HttpURLConnection&#xff09;&#xff0c;…...

rabbitMQ服务自动停止(已解决

1、 在rabbitmq的sbin目录下操作 rabbitmq-plugins enable rabbitmq_management 2、 自己去rabbitmq_server-3.7.5文件夹下创建一个data&#xff0c;再执行这个命令&#xff08;用自己的目录哈 set RABBITMQ_BASED:\RabbitTools\RabbitMQ\rabbitmq_server-3.7.5\data 然后去配…...

Qt平滑弹出页面

目标功能&#xff1a; (1)按下btn&#xff0c;弹出绿色页面。 (2)按下btn2,绿色页面隐藏。 (3)按下左边余下的区域&#xff0c;绿色页面也隐藏。 (4)平滑地显示和隐藏 效果&#xff1a; form.h #ifndef FORM_H #define FORM_H#include <QWidget>namespace Ui { class…...

第07天 Static关键字作用及用法

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…...

Redis扩容与一致性Hash算法解析

推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 「java、python面试题」来自UC网盘app分享&#xff0c;打开手机app&#xff0c;额外获得1T空间 https://dr…...