redis 多租户隔离 ACL 权限控制(redis-cli / nodejs的ioredis )

news/2024/7/19 14:07:50 标签: redis, 数据库, 缓存, node.js, js

Redis 6版本之后:提供ACL的功能对用户进行更细粒度的权限控制 :(1)接入权限:用户名和密码(2)可以执行的命令(3)可以操作的 KEY

ACL常用规则介绍:

+指令列表   //增加可操作指令列表, 比如:select auth

+@指令类别    //增加可操作指令类别,比如@admin @set

acl cat //查看所有指令类别

~<pattern> //可操作的匹配pattern的键

redis数据库默认是0~15,可通过databases参数调整

redis多租户的几种实现方式:

1.redis6 之后可以通过acl 进行多租户隔离,每个用户一个db

2.基于容器,每个用户一个redis实例。
 

以下代码测试版本为 redis 7.0

redis-cli设置多租户隔离:

ACL SETUSER username on >password +@all ~* -@admin -select +select|5  // +@all 增加所有权限 ~*允许所有键 移除@admin权限 只允许select切换db5

auth username 123456

select 1 //切换db1 会提示没有权限:(error) NOPERM this user has no permissions to run the 'select' command or its subcommand

select 5

ACL DELUSER username  //删除用户

redis-cli --user username --pass 123456 -n 1 # 以db1 连接

nodejs库 ioredis设置多租户隔离:

async function createUser(){

  const redis = new Redis({
    password: redisPassword,
    host: redisHost,
    port: redisPort
  });
  try{
    const db = genNumber(); //此db 需自动生成递增数字
    
    const username = `${serviceName}_ecmaster`, 
    password = uuid.v4().replaceAll("-",""), 
    rules = [
      '+@all',
      '~*',
      '-@admin',
      '-select',
      `+select|${db}`,
    ];
    

    // 创建用户
    await redis.acl(
      'SETUSER',
      username, 'on', `>${password}`,
      ...rules
    );
    
    console.log(`User ${username} created successfully.`);

    dockerSetting.dataSource.redis = {
      username,    
      password,
      "host": redisHost,
      "port": redisPort,
      db
    }   
  }catch(e){
    throw e;
  }finally{
    redis.disconnect();
  }
}

async function deleteUser(){
  const redis = new Redis({
    password: redisPassword,
    host: redisHost,
    port: redisPort
  });
  try{
  const username = `${serviceName}_ecmaster`;
// 删除用户
  await redis.call('ACL', 'DELUSER', username);
  console.log(`User ${username} deleted successfully.`);
  }catch(e){
    throw e;
  }finally{
    redis.disconnect();
  }
}

redisInsight可视化工具测试,无法在非授权db上操作key了:


http://www.niftyadmin.cn/n/5027644.html

相关文章

string的使用和模拟实现

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; C&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大…

uniapp掉完接口后刷新当前页面方法

uniapp掉完接口后刷新当前页面方法 掉完接口&#xff0c;里面加下面这个方法uni.redirectTo({}) setTimeout(() > {uni.redirectTo({// 当前页面路由url: /pages/property/mutualrotation/mutualrotation);}, 500)实例 mutualRotationSubmit() {let self this;uni.showMod…

[QT]day1

#include "mywidget.h" //#include "ui_mywidget.h"myWidget::myWidget(QWidget *parent): QWidget(parent) //显行调用父类的有参构造完成对子类从父类继承下来成员的初始化工作 // , ui(new Ui::myWidget) //给自己类中的指针成员初始化空间&#…

月薪3000,该如何积累财富?查理·芒格教你三招

如果你真的想成功积累财富&#xff0c;请静下心读完这篇文章 有人说&#xff0c;要想获得不错的投资收益&#xff0c;快速积累财富&#xff0c;就需要不菲的资金。但根据查理芒格的投资思想&#xff0c;即使你月薪低至3000、五六年工资没有变化&#xff0c;你也可以通过下面的方…

Springboot 实践(15)spring config 配置与运用—自动刷新

目前&#xff0c;网络上讲解spring config的自动刷新&#xff0c;都是通过git服务站的webhook功能执行“actuator/bus-refresh”服务实现的自动刷新。我们的前文讲解的配置中心&#xff0c;配置中心仓库使用的时本地地址&#xff0c;如下图所示&#xff1a; 那么&#xff0c;配…

国家网络安全周 | 天空卫士CEO刘霖在《中国网信》杂志发表署名文章

由中共中央网络安全和信息化委员会办公室、中华人民共和国国家互联网信息办公室主管的《中国网信》2023年第9期总第21期&#xff0c;在2023年国家网络安全宣传周开幕式时同期发布。《中国网信》杂志致力于宣传解读中央网络安全和信息化委员会及其办公室的重大决策部署和重点工作…

Linux——(第八章)定时任务调度

目录 1.概述 2.crontab 服务管理 3.crontab 定时任务设置 1.概述 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序 任务调度分类&#xff1a; &#xff08;1&#xff09;系统工作&#xff1a;有些重要的工作必须周而复始地执行。如病毒扫描。 &#xff08;…

JS中字体文件的加载和使用

1、加载字体文件 加载字体文件主要用到 FontFace 这个对象 // 字体加载 export function loadFont(_fontName, _fontUrl) {let reg new RegExp(\\b _fontName \\b)let _fontFamily document.body.style.fontFamilyif (reg.test(_fontFamily)) {return}let prefont new F…