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)是如何工作的?》 是转载文章,点击查看原文。

