網(wǎng)站建設(shè)需要哪些技能天津seo顧問
Redis 6版本之后:提供ACL的功能對用戶進(jìn)行更細(xì)粒度的權(quán)限控制 :(1)接入權(quán)限:用戶名和密碼(2)可以執(zhí)行的命令(3)可以操作的 KEY
ACL常用規(guī)則介紹:
+指令列表?? //增加可操作指令列表, 比如:select auth
+@指令類別? ? //增加可操作指令類別,比如@admin @set
acl cat //查看所有指令類別
~<pattern> //可操作的匹配pattern的鍵
redis數(shù)據(jù)庫默認(rèn)是0~15,可通過databases參數(shù)調(diào)整
redis多租戶的幾種實(shí)現(xiàn)方式:
1.redis6 之后可以通過acl 進(jìn)行多租戶隔離,每個(gè)用戶一個(gè)db
2.基于容器,每個(gè)用戶一個(gè)redis實(shí)例。
?
以下代碼測試版本為 redis 7.0
redis-cli設(shè)置多租戶隔離:
ACL SETUSER username on >password +@all ~* -@admin -select +select|5? // +@all 增加所有權(quán)限 ~*允許所有鍵 移除@admin權(quán)限 只允許select切換db5
auth username 123456
select 1 //切換db1 會(huì)提示沒有權(quán)限:(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設(shè)置多租戶隔離:
async function createUser(){const redis = new Redis({password: redisPassword,host: redisHost,port: redisPort});try{const db = genNumber(); //此db 需自動(dòng)生成遞增數(shù)字const username = `${serviceName}_ecmaster`, password = uuid.v4().replaceAll("-",""), rules = ['+@all','~*','-@admin','-select',`+select|${db}`,];// 創(chuàng)建用戶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可視化工具測試,無法在非授權(quán)db上操作key了: