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

作者:Victor356日期:2025/10/29

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

1. 基本概念

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

2. 配置ACL

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

配置文件示例

1# redis.conf
2
3# 启用默认用户,并允许所有命令
4user default on nopass ~* +@all
5
6# 创建一个只读用户
7user read_only_user on >readonlypassword ~* +@read
8
9# 创建一个只写用户
10user write_only_user on >writeonlypassword ~* +@write
11

3. 动态管理用户和权限

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

创建和修改用户

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

1# 创建一个只读用户
2ACL SETUSER read_only_user on >readonlypassword ~* +@read
3
4# 创建一个只写用户
5ACL SETUSER write_only_user on >writeonlypassword ~* +@write
6

删除用户

使用 ACL DELUSER 命令删除用户。

1# 删除用户
2ACL DELUSER write_only_user
3

查看用户信息

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

1# 列出所有用户
2ACL LIST
3

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

1# 获取指定用户的信息
2ACL GETUSER read_only_user
3

4. 客户端代码示例

连接和认证

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

1import redis.clients.jedis.Jedis;
2
3public class RedisACLExample {
4    public static void main(String[] args) {
5        try (Jedis jedis = new Jedis("localhost", 6379)) {
6            // 认证为只读用户
7            jedis.auth("read_only_user", "readonlypassword");
8
9            // 尝试进行读取操作
10            String response = jedis.ping();
11            System.out.println(response);  // 应该输出 "PONG"
12
13            // 尝试写入操作(将会失败)
14            try {
15                jedis.set("key", "value");
16            } catch (Exception e) {
17                System.out.println("Write operation failed: " + e.getMessage());
18            }
19        }
20    }
21}
22

动态设置用户和权限

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

1import redis.clients.jedis.Jedis;
2
3public class RedisDynamicACLExample {
4    public static void main(String[] args) {
5        try (Jedis jedis = new Jedis("localhost", 6379)) {
6            // 创建或更新用户 read_only_user
7            jedis.aclSetUser("read_only_user", "on", ">" + "readonlypassword", "~*", "+@read");
8
9            // 认证为新用户
10            jedis.auth("read_only_user", "readonlypassword");
11
12            // 测试连接
13            String response = jedis.ping();
14            System.out.println(response);  // 应该输出 "PONG"
15        }
16    }
17}
18

查看和删除用户

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

1import redis.clients.jedis.Jedis;
2
3public class RedisViewAndDeleteUserExample {
4    public static void main(String[] args) {
5        try (Jedis jedis = new Jedis("localhost", 6379)) {
6            // 获取指定用户的信息
7            String userInfo = jedis.aclGetUser("read_only_user");
8            System.out.println(userInfo);
9
10            // 删除用户
11            jedis.aclDelUser("read_only_user");
12        }
13    }
14}
15

5. 详细权限控制

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

允许访问特定键

1# 允许用户只访问前缀为 "prefix:" 的键
2ACL SETUSER user_with_key_access on >password ~prefix:* +@all
3

允许特定命令

1# 允许用户执行 GET 和 SET 命令
2ACL SETUSER user_with_commands on >password ~* +@all -@write +get +set
3

禁止特定命令

1# 禁止用户执行 FLUSHDB 和 FLUSHALL 命令
2ACL SETUSER user_without_flush on >password ~* +@all -flushdb -flushall
3

总结

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

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


Redis(91)Redis的访问控制列表(ACL)是如何工作的?》 是转载文章,点击查看原文


相关推荐


Java Stream流两大实战陷阱:并行流Parallel误用、List转Map时重复键异常
IT橘子皮2025/10/26

在Java 8引入的Stream API极大地简化了集合操作,让函数式编程在Java世界中大放异彩。然而,在实践中发现的,Stream API并非银弹,其中隐藏着一些容易踩坑的陷阱。本文将深入分析Stream流中最常见的两大问题:并行流的误用和List转Map时的重复键异常,并提供相应的解决方案。 一、并行流(parallel)的陷阱与优化方案 1.1 问题本质分析 并行流看似是性能优化的"神器",但实践表明,盲目使用parallel()可能适得其反: // 看似高效的并行处理,实则是性能陷阱


C 语言标准库头文件 locale.h
hubenchang05152025/10/23

#C 语言标准库头文件 locale.h 请查看 C 语言标准库头文件列表 了解更多相关 API。 这个头文件提供 本地化 的相关功能,例如设置数字和货币的格式。 设置语言环境需要操作系统支持,通常需要安装语言包。 例如: sudo apt install language-pack-zh-hans # 安装中文语言包 #类型 类型标准说明lconvC89格式化详细信息 #宏 宏标准说明NULLC89空指针常量 本地化类别宏标准说明LC_ALLC89整个 C 语言环境LC_COLLATE


火狐浏览器替换js脚本
绘梨衣の沉默2025/10/22

一、概述 本教程使用火狐浏览器演示替换前端js脚本的操作步骤。 为了方便演示,教程中使用此页面作为案例进行讲解: https://www.leavescn.com/files/demos/1-snow/snow.html 这是一个使用js代码实现的展示下雪特效的页面,如下图所示: 本教程主要演示js代码的替换过程,对于功能复杂的网站,前端包含诸多js文件,需要具备一定的js基础,能够读懂源码后才能找到你需要替换的那个js文件。 二、步骤 使用火狐浏览器打开此网页,然后按下F12键打


Redis(75)Redis分布式锁的性能如何优化?
Victor3562025/10/21

优化Redis分布式锁的性能可以从多个方面入手,包括减少锁的粒度、使用Lua脚本来确保原子操作、优化网络通信、提高Redis服务器的性能,以及优化锁的实现逻辑等。以下是一些常见的性能优化方法,并结合代码进行详细解释。 1. 减少锁的粒度 锁的粒度越小,竞争的机会就越少,从而提高系统的并发性能。比如,将全局锁拆分为多个局部锁。 // 假设我们有多个资源需要加锁,可以为每个资源设置不同的锁 public class FineGrainedRedisLock { private Jedis j


为什么 .gitignore 不生效?其实你忘了用 git rm --cached!
唐青枫2025/10/20

简介 命令格式: git rm --cached <file> 意思: 从 Git 的 索引(index,暂存区) 中移除文件,但保留工作区中的实际文件。 也就是说: 文件仍然留在硬盘(工作区); 但不再被 Git 跟踪(tracked)。 <file>...:要移除的文件或目录路径。可以指定多个文件,或使用通配符(如 *.log)。 常用选项: --cached:仅从索引移除(必须使用)。 -r 或 --recursive:递归移除目录及其内容(如果指定目录)。


【XR硬件系列】破局“芯”瓶颈:深入浅出解析XR专用芯片的必然性
元宇宙_H2025/10/18

关键词:XR芯片、低延迟、六自由度(6DoF)、异构计算、R1芯片、Motion-to-Photon、功耗、Qualcomm XR 引言:从“玩具”到“工具”的鸿沟 还记得早期的VR头显吗?厚重的机身、粗糙的画面,以及那令人不悦的眩晕感。这些体验上的“硬伤”,曾让XR技术长期徘徊在主流市场的边缘。其核心瓶颈之一,就在于当时的设备大多沿用手机等移动平台的通用芯片(SoC)。 这些“全能但不专精”的芯片,无法满足XR这一“性能吞噬兽”的苛刻需求。今天,我们就来深入探讨,为什么XR的进化之


Redis(66)Redis如何实现分布式锁?
Victor3562025/10/17

Redis 提供了多种方法来实现分布式锁,确保多个进程或机器能够协调地访问共享资源。以下是详细的实现步骤和代码示例。 1. 基于 SET 命令的分布式锁 获取锁 获取锁的核心是使用 SET 命令,并带上 NX 和 EX 选项: NX(Not eXists): 仅当键不存在时才设置键。 EX(EXpire): 设置键的过期时间,防止死锁。 # 获取锁示例 SET mylock <lock_value> NX EX 10 Lua 脚本实现 为了更加原子化,可以使用 Lua 脚本: -- 获取锁


告别异常继承树:从 NopException 的设计看“组合”模式如何重塑错误处理
canonical_entropy2025/10/16

在软件开发中,异常处理是一个不可或缺的环节。长久以来,经典的面向对象思想教导我们,为不同类型的错误建立一个庞大的继承树是一种优雅的方案。例如,定义一个基础的 AppException,然后派生出 BusinessException、SystemException 等。这种基于**继承(Inheritance)**的设计模式直观且经典。时至今日,这种思想在许多开发者心中依然根深蒂固,被认为是“正统”的 OO 设计。 然而,当系统走向分布式、服务化,并需要应对复杂的国际化、多租户、定制化需求时,这个


libevent输出缓存区的数据
我梦之62025/10/14

在网络开发中,当需要在不干扰客户端正常接收数据的前提下,验证服务端输出缓冲区中待发送数据的存在性、完整性或格式正确性(如排查客户端收不到数据的故障、确认发送数据是否符合协议规范),或监控缓冲区数据堆积情况时,会用到这段基于 libevent 库的代码。 其核心功能是对客户端连接的输出缓冲区(evbuffer)进行 “非破坏性读取”—— 先通过bufferevent_get_output获取与客户端client2关联的输出缓冲区指针,再用evbuffer_get_length获取缓冲区中待发送数据


设计模式-策略模式
紫菜紫薯紫甘蓝2025/10/13

设计模式-策略模式 策略模式,英文全称是 Strategy Design Pattern。它是这样定义的:Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 翻译成中文就是:定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0