南询 發表於 2025-10-30 11:03:56

Redis配置ACL访问控制列表的实现

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 配置文件中的ACL配置</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">修改Redis配置文件</a></li></ul><li><a href="#_label1">2. 使用动态命令管理ACL</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_1">创建和修改用户</a></li><li><a href="#_lab2_1_2">删除用户</a></li><li><a href="#_lab2_1_3">查看用户信息</a></li></ul><li><a href="#_label2">3. 使用客户端代码配置和管理ACL</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_4">Java示例:连接和认证</a></li><li><a href="#_lab2_2_5">Java示例:动态设置用户和权限</a></li><li><a href="#_lab2_2_6">Java示例:查看和删除用户</a></li></ul><li><a href="#_label3">4. 高级权限控制</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_7">仅允许访问特定键</a></li><li><a href="#_lab2_3_8">仅允许特定命令</a></li><li><a href="#_lab2_3_9">禁止特定命令</a></li></ul><li><a href="#_label4">总结</a></li><ul class="second_class_ul"></ul></ul></div><p>配置Redis的ACL(访问控制列表)涉及创建和管理用户、设置用户的权限,并确保用户只能执行被允许的命令和访问被允许的键。本文将详细介绍如何通过配置文件和动态命令来配置Redis的ACL,并结合代码示例进行说明。</p>
<p class="maodian"><a name="_label0"></a></p><h2>1. 配置文件中的ACL配置</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>修改Redis配置文件</h3>
<p>可以在Redis配置文件 (<code>redis.conf</code>) 中配置ACL。以下是一个示例配置:</p>
<div class="jb51code"><pre class="brush:plain;"># redis.conf

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

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

# 创建一个只写用户
user write_only_user on &gt;writeonlypassword ~* +@write
</pre></div>
<p>上述配置定义了三个用户:</p>
<ol><li><code>default</code> 用户:允许所有命令,不需要密码。</li><li><code>read_only_user</code> 用户:只读用户,只允许读操作,用密码 <code>readonlypassword</code> 进行认证。</li><li><code>write_only_user</code> 用户:只写用户,只允许写操作,用密码 <code>writeonlypassword</code> 进行认证。</li></ol>
<p class="maodian"><a name="_label1"></a></p><h2>2. 使用动态命令管理ACL</h2>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>创建和修改用户</h3>
<p>使用 <code>ACL SETUSER</code> 命令可以在运行时动态创建或修改用户并设置其权限。</p>
<div class="jb51code"><pre class="brush:sql;"># 创建或修改只读用户
ACL SETUSER read_only_user on &gt;readonlypassword ~* +@read

# 创建或修改只写用户
ACL SETUSER write_only_user on &gt;writeonlypassword ~* +@write
</pre></div>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>删除用户</h3>
<p>使用 <code>ACL DELUSER</code> 命令可以删除用户。</p>
<div class="jb51code"><pre class="brush:sql;"># 删除用户
ACL DELUSER write_only_user
</pre></div>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>查看用户信息</h3>
<p>使用 <code>ACL LIST</code> 命令查看所有用户的信息。</p>
<div class="jb51code"><pre class="brush:sql;"># 列出所有用户
ACL LIST
</pre></div>
<p>使用 <code>ACL GETUSER</code> 命令查看特定用户的信息。</p>
<div class="jb51code"><pre class="brush:sql;"># 获取指定用户的信息
ACL GETUSER read_only_user
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3. 使用客户端代码配置和管理ACL</h2>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>Java示例:连接和认证</h3>
<p>使用Jedis Java客户端连接Redis并进行用户认证:</p>
<div class="jb51code"><pre class="brush: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());
            }
      }
    }
}
</pre></div>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>Java示例:动态设置用户和权限</h3>
<p>使用Jedis Java客户端在运行时动态管理用户和权限:</p>
<div class="jb51code"><pre class="brush:sql;">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", "&gt;" + "readonlypassword", "~*", "+@read");

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

            // 测试连接
            String response = jedis.ping();
            System.out.println(response);// 应该输出 "PONG"
      }
    }
}
</pre></div>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>Java示例:查看和删除用户</h3>
<p>使用Jedis Java客户端查看和删除用户:</p>
<div class="jb51code"><pre class="brush:sql;">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");
      }
    }
}
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 高级权限控制</h2>
<p>可以通过ACL命令进行更细粒度的权限控制,例如仅允许访问特定的键或命令。</p>
<p class="maodian"><a name="_lab2_3_7"></a></p><h3>仅允许访问特定键</h3>
<div class="jb51code"><pre class="brush:sql;"># 允许用户只访问前缀为 "prefix:" 的键
ACL SETUSER user_with_key_access on &gt;password ~prefix:* +@all
</pre></div>
<p class="maodian"><a name="_lab2_3_8"></a></p><h3>仅允许特定命令</h3>
<div class="jb51code"><pre class="brush:sql;"># 允许用户执行 GET 和 SET 命令
ACL SETUSER user_with_commands on &gt;password ~* +@all -@write +get +set
</pre></div>
<p class="maodian"><a name="_lab2_3_9"></a></p><h3>禁止特定命令</h3>
<div class="jb51code"><pre class="brush:sql;"># 禁止用户执行 FLUSHDB 和 FLUSHALL 命令
ACL SETUSER user_without_flush on &gt;password ~* +@all -flushdb -flushall
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>总结</h2>
<p>Redis的访问控制列表(ACL)提供了一种细粒度的权限控制机制,可以为不同用户设置不同的权限。通过在配置文件中配置和使用动态命令,可以创建、修改和删除用户,并设置用户的权限。ACL使得可以更安全地控制哪些用户可以执行哪些命令和访问哪些键,从而提高Redis实例的安全性。</p>
<p>上述示例代码展示了如何在实际应用中使用ACL进行用户认证和权限管理。通过合理配置ACL,可以有效保护Redis实例,防止未经授权的访问和操作。</p>
頁: [1]
查看完整版本: Redis配置ACL访问控制列表的实现