real-Token v1.28.0

一个轻量级 thinkphp6 权限认证框架,让鉴权变得简单、优雅!


前言:

  • 我们将会尽力讲解每个功能的设计原因、应用场景,用心阅读文档,你学习到的将不止是 real-Token 框架本身,更是绝大多数场景下权限设计的最佳实践。

  • 开源不易,点个 star 鼓励一下吧!

基础介绍

是一个轻量级 php 权限认证框架,主要解决:登录认证权限认证单点登录、等一系列权限相关问题。目前代码针对于thinkphp6,可以自行调整

real-Token 功能一览

  • 登录认证 —— 单端登录、多端登录
  • 权限认证 —— 权限认证、角色认证
  • 踢人下线 —— 根据账号id踢人下线、根据Token值踢人下线
  • 单点登录 —— 单点登录
  • 模拟他人账号 —— 实时操作任意用户状态数据
  • 临时身份切换 —— 将会话身份临时切换为其它账号
  • 前后台分离 —— APP、小程序等不支持Cookie的终端
  • 花式token生成 —— 内置六种Token风格,还可:自定义Token生成策略、自定义Token前缀

目录结构

  • token/Driver.php规范token的方法和功能
  • token/driver/Mysql token的数据库驱动
  • token/driver/Redis token的Redis驱动
  • token.php token的链接token驱动并执行驱动的方法
  • auth.php 权限管理类

数据库

如果多模块的话,需要建立对应的用户表、用户分组表、用户权限表

/*
Navicat MySQL Data TransferSource Server         : real-think
Source Server Version : 50734
Source Host           : 8.136.216.46:3306
Source Database       : real-thinkTarget Server Type    : MYSQL
Target Server Version : 50734
File Encoding         : 65001Date: 2021-10-17 15:18:39
*/SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for jm_admin
-- ----------------------------
DROP TABLE IF EXISTS `jm_admin`;
CREATE TABLE `jm_admin` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`group_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '组别ID',`username` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '用户名',`nickname` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '昵称',`password` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '密码',`salt` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '密码盐',`email` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '电子邮箱',`mobile` varchar(11) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '手机号',`avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '头像',`level` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '等级',`gender` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '性别:0=女,1=男',`birthday` date DEFAULT NULL COMMENT '生日',`bio` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '格言',`money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '余额',`score` int(10) NOT NULL DEFAULT '0' COMMENT '积分',`successions` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '连续登录天数',`maxsuccessions` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '最大连续登录天数',`prevtime` int(10) DEFAULT NULL COMMENT '上次登录时间',`logintime` int(10) DEFAULT NULL COMMENT '登录时间',`loginip` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '登录IP',`loginfailure` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '失败次数',`joinip` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '加入IP',`jointime` int(10) DEFAULT NULL COMMENT '加入时间',`createtime` int(10) DEFAULT NULL COMMENT '创建时间',`updatetime` int(10) DEFAULT NULL COMMENT '更新时间',`token` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT 'Token',`status` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '状态',`verification` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '验证',PRIMARY KEY (`id`),KEY `username` (`username`),KEY `email` (`email`),KEY `mobile` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员表';-- ----------------------------
-- Table structure for jm_admin_group
-- ----------------------------
DROP TABLE IF EXISTS `jm_admin_group`;
CREATE TABLE `jm_admin_group` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '组名',`rules` text COLLATE utf8mb4_unicode_ci COMMENT '权限节点',`createtime` int(10) DEFAULT NULL COMMENT '添加时间',`updatetime` int(10) DEFAULT NULL COMMENT '更新时间',`status` enum('normal','hidden') COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '状态',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员组表';-- ----------------------------
-- Table structure for jm_admin_rule
-- ----------------------------
DROP TABLE IF EXISTS `jm_admin_rule`;
CREATE TABLE `jm_admin_rule` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`pid` int(10) DEFAULT NULL COMMENT '父ID',`name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称',`title` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '标题',`remark` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',`ismenu` tinyint(1) DEFAULT NULL COMMENT '是否菜单',`createtime` int(10) DEFAULT NULL COMMENT '创建时间',`updatetime` int(10) DEFAULT NULL COMMENT '更新时间',`weigh` int(10) DEFAULT '0' COMMENT '权重',`status` enum('normal','hidden') COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '状态',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员规则表';-- ----------------------------
-- Table structure for jm_admin_token
-- ----------------------------
DROP TABLE IF EXISTS `jm_admin_token`;
CREATE TABLE `jm_admin_token` (`token` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Token',`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '会员ID',`createtime` int(10) DEFAULT NULL COMMENT '创建时间',`expiretime` int(10) DEFAULT NULL COMMENT '过期时间',PRIMARY KEY (`token`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员Token表';

引用

下载到tp6的extend\jmwl下

use jmwl\realjwt\Token;
use jmwl\realjwt\Auth;

驱动和配置

  $init= [// 驱动方式'type'     => 'Mysql','table'     =>"admin_token",//如果是Mysql使用的存储token的表名'userprefix'=>"up:",//如果是Redis使用的存储用户名前缀'tokenprefix'=>"tp:",//如果是Redis使用的存储token前缀// 缓存前缀'key'      => '30tvUyXl8NkOx7YKDAoLu5FQRIGTh4qa',// 加密方式'hashalgo' => 'ripemd160',// 缓存有效期 0表示永久缓存'expire'   => 0,];  $usertable="admin";//用户表名,自动对应用户分组表、用户权限表 如用户表名:admin,那么用户分组名:admin_group,用户权限表:admin_rule

token类的使用和功能

这里基本不会用到,主要用的是auth类

   /**Token::init($init);//判断Token是否可用Token::check($token, $user_id);//获取Token内的信息Token::get($token, $default = false);//写入TokenToken::set($token, $user_id, $expire = null);//删除TokenToken::delete($token);//清除TokenToken::clear($user_id = null);

auth的羁绊用法

基础用法

              //登录// $username="admin";// $password="123456"; //  $this->auth->login($username, $password);//   $this->auth->getUser()// $this->auth->getUserinfo()//读取当前token// $this->auth->getToken()// 判断是否登录// $this->auth->isLogin()//获取会员组别规则列表// $this->auth->getRuleList() // 设置当前请求的URI// $controllername= $this->request->controller();  // $actionname= $this->request->action();  // $path = str_replace('.', '/', $controllername) . '/' . $actionname;// $this->auth->setRequestUri($path);  // 获取当前请求的URI// $this->auth->getRequestUri()//检测是否是否有对应权限// $this->auth-> check($path)//根据Token初始化//  $token="1f52e96b-8919-49d0-8ba9-6c4619aa4b8a";//  $this->auth->init($token);//注册// $username="admin2";// $password="admin2"; // $email = '18354393242@163.com';// $mobile= '18354393243';// $this->auth-> register($username, $password, $email, $mobile, $extend = [])//加密密码//$this->auth->getEncryptPassword($oldpassword, $this->_user->salt);//退出//  $this->auth->logout()//真实删除//  $this->auth->delete($user_id)//查看报错// $this->auth->getError()

php的公共构造方法使用 验证权限

      //权限验证$this->auth = Auth::instance($init, $usertable);$this->request = Request::instance();// token$token = $this->request->server('HTTP_TOKEN');$controllername = $this->request->controller();$actionname = $this->request->action();$path = str_replace('.', '/', $controllername) . '/' . $actionname;$this->auth->setRequestUri($path);// 检测是否需要验证登录if (!$this->auth->match($this->noNeedLogin)) {//初始化$this->auth->init($token);//检测是否登录if (!$this->auth->isLogin()) {return $this->error('Please login first', null, 401);}// 判断是否需要验证权限if (!$this->auth->match($this->noNeedRight)) {// 判断控制器和方法判断是否有对应权限if (!$this->auth->check($path)) {return $this->error('You have no permission', null, 403);}}} else {// 如果有传递token才验证是否登录状态if ($token) {$this->auth->init($token);}}var_dump($this->auth->getUser());`

real-Token相关推荐

  1. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  2. SpringBoot2.3 修改响应头、添加更新token、解决在过滤器中修改失败

    前言 使用Spring Boot开发项目的过程中,难免会遇到向响应头中写入一些信息,例如更新了的token,用户详情等信息.在请求头中添加,请求时就可以通过过滤器,拦截器等验证或者获得请求头传递的信息 ...

  3. [JAVA EE]session 和 token 机制

    HTTP 协议是无状态的. 即服务器对于客户端每次发送的请求都认为它是一个新的请求. 本次请求和上次请求无法判断是不是同一个客户端操作的. 随着 Web 应用的发展,如在线购物网站,需要登录的网站等, ...

  4. php token的生成和使用

    原文连接:http://ukagaka.github.io/php/2018/05/08/JWT.html 1. 为什么要使用tokent进行登录 前后端分离或者为了支持多个web应用,那么原来的co ...

  5. token验证失败_ASP.NET CORE WEBAPI JWT 带BEARER的TOKEN

    JWT主要由三部分构成,header. payload .signature,下面给出详细的TOKEN生成及使用代码. 1.注册JWT服务 public void ConfigureServices( ...

  6. c# redis 如何设置过期时间_Redis Hash存储token、及设置过期时间

    相信大家在很多业务场景都会遇到对数据设置过期时间,如安全认证token.短信验证码等.一般我们的解决有几种:存redis.存数据库.实时计算(如JWT),不管使用哪种方式,需求就是过期了对数据的清理. ...

  7. php jwt token过期时间,php – 动态设置laravel jwt的到期时间

    嗨,我在前端使用角度js,在后端使用带有tymon jwt库的卫星和laravel.我正在使用jwt身份验证.我想在我的网络应用程序中记住我的功能.我看到'ttl'在laravel'config / ...

  8. php access token缓存,微信小程序PHP 生成access_token存入缓存

    每个小程序都会对应后台的一系列接口.access_token一天2000次,每个有效期为2小时.所以可以保存到缓存中,每隔一段时间去获取一次. 把appid和secret放在全局配置文件中,方便调用 ...

  9. php jwt使用案例,PHP使用JWT创建Token的实例详解

    iss (issuer)issuer请求实体,可以是发起请求的用户的信息,也可是jwt的签发者 sub (Subject)设置主题,类似于发邮件时的主题 aud (audience)接收jwt的一方 ...

  10. GitHub上传代码、更新代码、token设置

    准备工作: 创建GitHub账号. 在本机电脑安装git工具. git配置用户名和邮箱 打开git Bash,依此输入如下命令: git config --global user.name " ...

最新文章

  1. 《统一沟通-微软-实战》-5-部署-SharePoint Server 2010
  2. javaweb项目开发日志的原理,方式
  3. 毕业设计-基于SSM实现在线考试及题库管理系统
  4. Mysql 索引-1
  5. Java查询图书信息
  6. 解决df -h卡死问题
  7. 机器学习与计算机视觉(darknet编译)
  8. 经常听到一些老板说,你来公司上班就只是为了赚钱吗?
  9. 计算机网络系统组播功能_全国计算机等级考试四级计算机网络考试大纲(最新版2018年版)...
  10. [Java] 蓝桥杯BASIC-22 基础练习 FJ的字符串
  11. Atitit layout art 布局的艺术目录1. SpringLayout 类 弹簧布局管理器 12. BoxLayout( html默认布局) 11.SpringLayout
  12. 存储器容量的扩展 —— 位/字扩展
  13. 关于分布式服务中的中间件技术入门概述
  14. 如何写软件设计文档[转]
  15. 2013年,我的推荐博客汇总
  16. 【Mapreduce】利用job嵌套,多重Mapreduce,求解二度人脉
  17. Nginx-webpy快速搭建反向代理服务及web服务
  18. 关于weinre教程使用的补充(weinre-jar-1.6.1.zip下载)
  19. 基于Android Studio实现的学生蹭课APP
  20. 3DMAX森林树木植物插Forest Pack Pro 预设库安装教程

热门文章

  1. BPG编译出错 undefined reference to numa_available解决办法
  2. 有关ISP许可证以及ISP停办的原因
  3. swift 的网络解析 Alamofire
  4. 03-Swif-associatedtype的作用
  5. 【重要程序】判断闰年
  6. WIFI天气闹钟+无线夜灯控制(一)
  7. 手机用Postern配置socks5全局代理详细教程
  8. 华为开源自研AI框架昇思MindSpore应用案例:Colorization自动着色
  9. 解决kali更新源时出现签名无效问题
  10. es 关闭索引的作用