Redis(91)Redis的访问控制列表(ACL)是如何工作的?

Redis 6.0及以上版本支持访问控制列表(ACL),这允许更细粒度地控制不同用户的权限。ACL使得可以定义多个用户,每个用户有自己的一组权限,这些权限可以控制哪些命令可以执行,哪些键可以访问等。以下是Redis ACL的详细工作原理和示例代码。

1. 基本概念

  • 用户:Redis的每一个用户都有一个唯一的名字。
  • 权限:每个用户可以被授予一组权限,这些权限定义了用户可以执行哪些命令和访问哪些键。
  • 认证:用户在连接Redis时需要提供用户名和密码进行认证。

2. 配置ACL

可以在Redis配置文件 (redis.conf) 中配置ACL,或者通过命令在运行时配置。

配置文件示例

bash 复制代码
# redis.conf

# 启用默认用户,并允许所有命令
user default on nopass ~* +@all

# 创建一个只读用户
user read_only_user on >readonlypassword ~* +@read

# 创建一个只写用户
user write_only_user on >writeonlypassword ~* +@write

3. 动态管理用户和权限

你可以在Redis启动后通过ACL命令动态管理用户和权限。

创建和修改用户

使用 ACL SETUSER 命令创建或修改用户,并设置用户的权限。

bash 复制代码
# 创建一个只读用户
ACL SETUSER read_only_user on >readonlypassword ~* +@read

# 创建一个只写用户
ACL SETUSER write_only_user on >writeonlypassword ~* +@write

删除用户

使用 ACL DELUSER 命令删除用户。

bash 复制代码
# 删除用户
ACL DELUSER write_only_user

查看用户信息

使用 ACL LIST 命令查看所有用户的信息。

bash 复制代码
# 列出所有用户
ACL LIST

使用 ACL GETUSER 命令查看特定用户的信息。

bash 复制代码
# 获取指定用户的信息
ACL GETUSER read_only_user

4. 客户端代码示例

连接和认证

使用Jedis Java客户端连接Redis并进行用户认证:

java 复制代码
import redis.clients.jedis.Jedis;

public class RedisACLExample {
    public static void main(String[] args) {
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            // 认证为只读用户
            jedis.auth("read_only_user", "readonlypassword");

            // 尝试进行读取操作
            String response = jedis.ping();
            System.out.println(response);  // 应该输出 "PONG"

            // 尝试写入操作(将会失败)
            try {
                jedis.set("key", "value");
            } catch (Exception e) {
                System.out.println("Write operation failed: " + e.getMessage());
            }
        }
    }
}

动态设置用户和权限

使用Jedis Java客户端在运行时动态管理用户和权限:

java 复制代码
import redis.clients.jedis.Jedis;

public class RedisDynamicACLExample {
    public static void main(String[] args) {
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            // 创建或更新用户 read_only_user
            jedis.aclSetUser("read_only_user", "on", ">" + "readonlypassword", "~*", "+@read");

            // 认证为新用户
            jedis.auth("read_only_user", "readonlypassword");

            // 测试连接
            String response = jedis.ping();
            System.out.println(response);  // 应该输出 "PONG"
        }
    }
}

查看和删除用户

使用Jedis Java客户端查看和删除用户:

java 复制代码
import redis.clients.jedis.Jedis;

public class RedisViewAndDeleteUserExample {
    public static void main(String[] args) {
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            // 获取指定用户的信息
            String userInfo = jedis.aclGetUser("read_only_user");
            System.out.println(userInfo);

            // 删除用户
            jedis.aclDelUser("read_only_user");
        }
    }
}

5. 详细权限控制

可以通过ACL命令进行更细粒度的权限控制,例如仅允许访问特定的键或命令。

允许访问特定键

bash 复制代码
# 允许用户只访问前缀为 "prefix:" 的键
ACL SETUSER user_with_key_access on >password ~prefix:* +@all

允许特定命令

bash 复制代码
# 允许用户执行 GET 和 SET 命令
ACL SETUSER user_with_commands on >password ~* +@all -@write +get +set

禁止特定命令

bash 复制代码
# 禁止用户执行 FLUSHDB 和 FLUSHALL 命令
ACL SETUSER user_without_flush on >password ~* +@all -flushdb -flushall

总结

Redis的访问控制列表(ACL)提供了一种细粒度的权限控制机制,可以为不同用户设置不同的权限。通过配置文件和动态命令,可以创建、修改和删除用户,设置用户的权限。ACL使得可以更安全地控制哪些用户可以执行哪些命令和访问哪些键,从而提高Redis实例的安全性。

上述示例代码展示了如何在实际应用中使用ACL进行用户认证和权限管理。通过合理配置ACL,可以有效保护Redis实例,防止未经授权的访问和操作。

相关推荐
Victor3562 小时前
https://editor.csdn.net/md/?articleId=139321571&spm=1011.2415.3001.9698
后端
Victor3562 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
后端
灰子学技术4 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
Gogo8165 小时前
BigInt 与 Number 的爱恨情仇,为何大佬都劝你“能用 Number 就别用 BigInt”?
后端
fuquxiaoguang5 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
毕设源码_廖学姐6 小时前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
野犬寒鸦7 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
逍遥德8 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
MX_93598 小时前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
程序员泠零澪回家种桔子9 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构