TP框架 之think-auth权限认证

news2024/9/22 5:05:01

一、安装think-auth

composer require 5ini99/think-auth

二、数据表

-- ----------------------------
-- think_auth_rule,规则表,
-- id:主键,name:规则唯一标识, title:规则中文名称 status 状态:为1正常,为0禁用,condition:规则表达式,为空表示存在就验证,不为空表示按照条件验证
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_rule`;
CREATE TABLE `think_auth_rule` (
    `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
    `name` char(80) NOT NULL DEFAULT '',
    `title` char(20) NOT NULL DEFAULT '',
    `type` tinyint(1) NOT NULL DEFAULT '1',
    `status` tinyint(1) NOT NULL DEFAULT '1',
    `condition` char(100) NOT NULL DEFAULT '',  # 规则附件条件,满足附加条件的规则,才认为是有效的规则
    PRIMARY KEY (`id`),
    UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group 用户组表,
-- id:主键, title:用户组中文名称, rules:用户组拥有的规则id, 多个规则","隔开,status 状态:为1正常,为0禁用
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_group`;
    CREATE TABLE `think_auth_group` (
    `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
    `title` char(100) NOT NULL DEFAULT '',
    `status` tinyint(1) NOT NULL DEFAULT '1',
    `rules` char(80) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group_access 用户组明细表
-- uid:用户id,group_id:用户组id
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_group_access`;
    CREATE TABLE `think_auth_group_access` (
    `uid` mediumint(8) unsigned NOT NULL,
    `group_id` mediumint(8) unsigned NOT NULL,
    UNIQUE KEY `uid_group_id` (`uid`,`group_id`),
    KEY `uid` (`uid`),
    KEY `group_id` (`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

三、公共配置

四、代码实现

1、Base.php

<?php
namespace app\index\controller;

use think\auth\Auth;
use think\Controller;

class Base extends Controller
{
    public function initialize()
    {
        parent::initialize();

        $controller = request()->controller();
        $action = request()->action();

        $url = $controller.'/'.$action;
        $noCheck = ['Index/login', 'Index/index', 'Index/logout'];

        $uid = session('uid');
        if ($uid != 1) {
            if (!in_array($url, $noCheck)) {
                if (!$uid) {
                    $this->error('请先登陆系统!',url('index/login'));
                }
                $auth = new Auth();
                if (!$auth->check($url, $uid)) {
                    $this->error('没有权限', 'index/index');
                }
            }
        }

    }
}

2、Index.php

<?php
namespace app\index\controller;

class Index extends Base
{
    public function index()
    {
        return $this->fetch();
    }

    /**
     * 登录
     * @return mixed
     */
    public function login()
    {
        if ($this->request->isPost()) {
            $username = $this->request->post('username');
            $password = $this->request->post('password');

            $data = [
                'username' => $username,
                'password' => $password
            ];
            $result = $this->validate($data, 'app\index\validate\Member.login');

            if ($result !== true) {
                $this->error($result);
            }

            $member = (new \app\index\model\Member)->login($data);

            if ($member === false) {
                $this->error('账号或密码不正确');
            }
            session('uid', $member['id']);
            $this->redirect(url('index'));
        }
        return $this->fetch();
    }

    public function logout()
    {
        session('uid', 0);
        $this->redirect('login');
    }
}

3、自定义标签 MyTag.php

<?php

namespace app\common\taglib;


use think\auth\Auth;
use think\template\TagLib;

class MyTag extends TagLib
{
    protected $tags = [
        'auth' => ['attr' => 'rule', 'close' => 1]
    ];

    /**
     * 权限判断标签
     * @param $tag
     * @param $content
     * @return string
     */
    public function tagAuth($tag, $content)
    {
        $rule = $tag['rule'];
        $auth = new Auth();
        $uid = session('uid');
        $res = $auth->check($rule, $uid);
        $parseStr  = '<?php if(' . intval($res) . '): ?>' . $content .'<?php endif; ?>';
        return $parseStr;
    }
}

4、index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{MyTag:auth rule='Group/index'}
<a href="{:url('Group/index')}">用户组</a> &nbsp;&nbsp;&nbsp;&nbsp;
{/MyTag:auth}

{MyTag:auth rule='Member/index'}
<a href="{:url('Member/index')}">用户管理</a> &nbsp;&nbsp;&nbsp;&nbsp;
{/MyTag:auth}

{MyTag:auth rule='Rule/index'}
<a href="{:url('Rule/index')}">规则管理</a> &nbsp;&nbsp;&nbsp;&nbsp;
{/MyTag:auth}

<a href="{:url('index/logout')}">退出</a>
</body>
</html>

五、效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1436836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【日志记录】——单片机可执行文件合并

一&#xff1a;需求场景 现在有一片单片机&#xff0c;执行程序包括自定义boot和应用程序app, 在将打包好的固件给到生产时有以下问题&#xff0c;由于要通过jlink烧录boot&#xff0c;然后上电启动boot&#xff0c;通过boot烧录初始化程序&#xff0c;过程过于复杂&#xff0…

基于ESP-WROOM-32的双串口通信并显示到OLED显示屏上

目录 开发板引脚图 Arduino环境配置1.ESP32开发版下载2.Arduino开发板选择 -> ESP32 Dev Module3.安装驱动库 接线图Arduino代码现象演示 开发板 ESP-WROOM-32 引脚图 Arduino环境配置 1.ESP32开发版下载 选择 esp32 by Espressif Systems 2.Arduino开发板选择 -> E…

一文读懂「四大主流计算芯片 CPU、GPU、ASIC、FPGA」特点和场景

纵观人类历史&#xff0c;从结绳计数、木制计数到巴比伦的粘土板上的刻痕&#xff0c;再到中国古代的算盘&#xff0c;社会生产力的提高与当时所采用的计算工具密切相关。计算工具能力越强&#xff0c;就能大幅缩短人类解决复杂问题的时间&#xff0c;社会生产力水平自然就会越…

微信小程序解决华为手机保存图片到相册失败

1.新增隐私设置 2.优化代码 新增uni.authorize判断 _saveCode() {let that this;console.log(点击了保存图片)console.log(this.result)uni.authorize({scope: scope.writePhotosAlbum,success(e) {console.log(e)if (this.result ! "") {uni.saveImageToPhotosAlb…

RCS系统之:界面设计

RCS Floor Manager设计的主要目的&#xff1a; 实时监控机器人状态实时查看货架状态查看机器人任务状态查看捡货站的任务状态地图的状态信息其他元素&#xff0c;如打包机&#xff0c;机械臂的状态动态的编辑地图元素信息等等 有兴趣的可以留言一起交流下

[office] Excel2007在工作簿中创建区域名称 #职场发展#经验分享

Excel2007在工作簿中创建区域名称 Excel 提供了几种不同的方法来创建区域名称。但在开始之前&#xff0c;必须注意关于可接受内容的重要规则: 名称不能含有空格。可以用一个下划线字符来代替空格(如Annual Total ) 。 可以使用字母和数字的任意组合&#xff0c;但是名称必须以…

Redis + Lua 实现分布式限流器

文章目录 Redis Lua 限流实现1. 导入依赖2. 配置application.properties3. 配置RedisTemplate实例4. 定义限流类型枚举类5. 自定义注解6. 切面代码实现7. 控制层实现8. 测试 相比 Redis事务&#xff0c; Lua脚本的优点&#xff1a; 减少网络开销&#xff1a;使用Lua脚本&…

C++ STL精通之旅:向量、集合与映射等容器详解

目录 常用容器 顺序容器 向量vector 构造 尾接 & 尾删 中括号运算符 获取长度 清空 判空 改变长度 提前分配好空间 代码演示 运行结果 关联容器 集合set 构造 遍历 其他 代码演示 运行结果​编辑 映射map 常用方法 构造 遍历 其他 代码演示1​编…

搜索与图论(一)(深搜,广搜,树与图的存储遍历,拓扑排序)

一、DFS 往深里搜&#xff0c;搜到叶子结点那里&#xff0c;回溯&#xff0c;到可以继续到叶子结点深搜的位置。 1、回溯一定要恢复现场 2、定义一个与当前递归层数有关的终止条件&#xff08;题目要求的东西&#xff09; 3、每层都用循环判断是否存在可以dfs的路 输出数字…

PbootCMS采集插件使用教程

这篇Pboot采集教程教你使用PbootCMS采集插件&#xff0c;自动批量采集网页文章数据&#xff0c;并发布到PbootCMS系统&#xff0c;快速丰富网站的内容。 1. 下载并安装PbootCMS采集插件 1-1&#xff09;PbootCMS采集插件免费下载&#xff1a;Pboot采集插件-PbootCMS发布模块下…

「Mybatis实战五」:Mybatis核心文件详解 - MyBatis常用配置environments、properties

一、MyBatis核心配置文件层级关系 ​ 本文代码在 Mybatis初体验&#xff1a;一小时从入门到运行你的第一个应用 所构建的基础代码结构之上&#xff0c;进行修改。 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下&#xff1a; 二…

什么是大小端字节序存储?如何用代码判断当前的机器是大端字存储还是小端存储?

目录 什么是大端字节序存储与小端字节序存储 为什么会有大端和小端之分&#xff1f; 用代码判断当前机器是大端存储还是小端存储 什么是大端字节序存储与小端字节序存储 1.字节序&#xff1a;以字节为单位&#xff0c;讨论存储顺序 2.大端字节序存储&#xff1a;高位在低地…

C和C++面试--看的不多只看一篇

C和C面试 1. 语言基础1.1 C和C有什么区别&#xff1f;1.2 a和&a有什么区别&#xff1f;1.3 #define和const区别&#xff1f;&#xff08;编译阶段、安全性、内存占用等&#xff09;1.4 inline函数1.5 对于⼀个频繁使⽤的短⼩函数&#xff0c;应该使⽤什么来实现&#xff1f…

【C语言】三子棋游戏实现代码

目录 1.三子棋代码功能介绍 2.三子棋游戏实现步骤 ①打印菜单栏 ②判断是否进入三子棋游戏 ③三子棋游戏基本函数实现 &#xff08;1&#xff09;清空&#xff08;初始化&#xff09;棋盘函数实现 &#xff08;2&#xff09;打印棋盘函数实现 &#xff08;3&#xff0…

【HTML】MDN

文章目录 一、html元素1.1 <a>1.2 <abbr>1.3 <address>1.4<area>1.5 <article>1.6 <aside>1.7 <audio>1.8 <b>1.9 <base>1.10<bdi>1.11 <bdo>1.12 <blockquote>1.13 <body>1.14 <br>1.15…

计组学习笔记2024/2/4

1.计算机的发展历程 2.计算机硬件的基本组成 存储器 -> 就是内存. 3.各个硬件的部件 寄存器 -> 用来存放二进制数据. 各个硬件的工作原理视频留白,听完后边课程之后再来理解理解. 冯诺依曼计算机的特点: 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器,…

计算机视觉 | OpenCV 实现手势虚拟控制亮度和音量

Hi&#xff0c;大家好&#xff0c;我是半亩花海。在当今科技飞速发展的时代&#xff0c;我们身边充斥着各种智能设备&#xff0c;然而&#xff0c;如何更便捷地与这些设备进行交互却是一个不断被探索的课题。本文将主要介绍一个基于 OpenCV 的手势识别项目&#xff0c;通过手势…

Qt程序设计-导出PDF

本文讲解如何实现导出PDF,包含如何使用HTML格式和添加图片。 实例如下: 创建项目,添加两个按钮,并在D盘提前准备好图片。 窗体的头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>#include <QPrinter> #include <QPainter> #i…

Oracle systemstate、gdb、dbx介绍

当数据库出现严重的性能问题或者hang了的时候&#xff0c; 可能最常用的办法就是重启数据库&#xff0c;简单有效解决问题&#xff1b;但是重启后如何追踪问题的根本原因成了难题&#xff0c;很多信息随着重启也消失不见了&#xff0c;让追查问题变的十分棘手&#xff0c;这时就…

ElementUI鼠标拖动没列宽度

其实 element ui 表格Table有提供给我们一个resizable属性 按官方文档上描述 它就是控制是否允许拖拽表格列大小的属性 而且 它的默认值就是 true 但是依旧很多人会反应拖拽不了 首先 表格要有边框 如果没有变宽 确实是拖拽不了 给 el-table加上 border属性 运行结果如下 但…