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

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了:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李庆政370

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值