犍为移动网站建设宁波网络推广平台
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了: