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


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

    ACL常用规则介绍:

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

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

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

    ~ //可操作的匹配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设置多租户隔离:

    1. async function createUser(){
    2. const redis = new Redis({
    3. password: redisPassword,
    4. host: redisHost,
    5. port: redisPort
    6. });
    7. try{
    8. const db = genNumber(); //此db 需自动生成递增数字
    9. const username = `${serviceName}_ecmaster`,
    10. password = uuid.v4().replaceAll("-",""),
    11. rules = [
    12. '+@all',
    13. '~*',
    14. '-@admin',
    15. '-select',
    16. `+select|${db}`,
    17. ];
    18. // 创建用户
    19. await redis.acl(
    20. 'SETUSER',
    21. username, 'on', `>${password}`,
    22. ...rules
    23. );
    24. console.log(`User ${username} created successfully.`);
    25. dockerSetting.dataSource.redis = {
    26. username,
    27. password,
    28. "host": redisHost,
    29. "port": redisPort,
    30. db
    31. }
    32. }catch(e){
    33. throw e;
    34. }finally{
    35. redis.disconnect();
    36. }
    37. }
    38. async function deleteUser(){
    39. const redis = new Redis({
    40. password: redisPassword,
    41. host: redisHost,
    42. port: redisPort
    43. });
    44. try{
    45. const username = `${serviceName}_ecmaster`;
    46. // 删除用户
    47. await redis.call('ACL', 'DELUSER', username);
    48. console.log(`User ${username} deleted successfully.`);
    49. }catch(e){
    50. throw e;
    51. }finally{
    52. redis.disconnect();
    53. }
    54. }

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

  • 相关阅读:
    如何正确关闭偶发的安卓App闪退Bug?
    计算机网络的体系结构
    【ASM】字节码操作 工具类与常用类 TraceClassVisitor 介绍
    面试官:设计一个异步并发限制吧
    5147. 数量
    Java抽象类和接口
    Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单
    Python判断多个文件夹的文件夹名是否包含“分公司”或“营销中心”怎么处理?(方法三)...
    Git仓库迁移实操(附批量迁移脚本)
    【LeetCode】779. 第K个语法符号
  • 原文地址:https://blog.csdn.net/qq_42152032/article/details/132766169