Garnet ACL 命令完全指南:用户、密码与命令级权限控制实战

发布时间:2026/9/15 10:22:15

Garnet ACL 命令完全指南:用户、密码与命令级权限控制实战 Garnet ACL 命令完全指南用户、密码与命令级权限控制实战【免费下载链接】garnetGarnet is a remote cache-store from Microsoft Research that offers strong performance (throughput and latency), scalability, storage, recovery, cluster sharding, key migration, and replication features. Garnet can work with existing Redis clients.项目地址: https://gitcode.com/GitHub_Trending/garnet4/garnet本指南以 Garnet 仓库的 ACL 命令文档 为主体完整讲解ACL家族的全部 10 个子命令CAT、DELUSER、GETUSER、GENPASS、LIST、LOAD、SAVE、SETUSER、USERS、WHOAMI的语法、语义与 RESP 返回格式并结合 ACLCommands.cs、ACLParser.cs、AccessControlList.cs 等源码深入讲解底层实现。读完本文你将能够配置 Garnet 的 ACL 认证、通过命令创建和管理受限用户、为自定义扩展命令下发细粒度权限、以及正确使用 ACL 文件实现规则的原子化加载与持久化。ACL 在 Garnet 中的角色Garnet 的 ACLAccess Control List系统为每一位连接用户定义了可以执行哪些命令、使用哪些命令类别、拥有哪些密码从而实现对远程缓存存储的多租户隔离与最小权限管理。从源码结构看ACL 相关实现集中在 libs/server/ACL 目录核心类型包括AccessControlList.cs管理所有用户句柄UserHandle的顶层容器支持从文件加载、保存到文件User.cs单个用户的权限模型开关状态、密码哈希集合、命令与类别权限ACLParser.cs将 ACL 规则文本解析为User对象UserHandle.cs并发安全的用户引用句柄配合TrySetUser实现无锁权限更新。每个新连接默认使用名为default的用户进行认证。只有将服务器配置为 ACL 认证方式GarnetACLAuthenticator后ACL命令才可用否则服务端会返回ERR ACL authentication is disabled对应源码ValidateACLAuthenticator见 ACLCommands.cs。启用 ACL前置条件与配置项在运行任何ACL命令之前需要通过命令行或配置文件指定 ACL 用户文件例如dotnet run --project main/GarnetServer -- --acl-file /path/to/users.acl对应的配置项定义在 Options.cs配置项类型默认值说明--acl-filestringnull外部 ACL 用户文件路径未指定时仅创建default用户--acl-strict-custom-commandsbooltrue为 true默认时ACL 规则引用了未被任何已加载模块注册的自定义命令名服务器拒绝启动为 false 时按原样加载未解析的名字并记录警告这两个选项同时出现在 defaults.conf 中键名AclFile并兼容 Redis 风格的aclfile配置见 RedisOptions.cs。配置文件中若未定义default用户的密码则使用--password指定的密码作为其密码若两者都未提供default用户将变为免密登录nopass见 AccessControlList.cs 中默认用户的自动创建逻辑。ACL 认证设置由抽象类 AclAuthenticationSettings.cs 承载实际有两种实现AclAuthenticationPasswordSettings.cs密码认证与 AclAuthenticationAadSettings.cs结合 AAD 认证。提示测试套件 AclConfigurationFileTests.cs 展示了如何以useAcl: true, aclFile: ...启动带 ACL 的服务器并验证ACL USERS、ACL LIST的输出可作为集成验证的参考。ACL 规则语法与命令类别ACL SETUSER的规则、ACL 文件的每一行都遵循统一的规则语法。由 ACLParser.cs 的定义可知支持以下操作操作含义on/off启用 / 禁用用户账号password/password添加 / 移除明文密码#hash/!hash添加 / 移除密码哈希以#前缀存储于GETUSER输出nopass允许该用户免密登录同时清空密码列表resetpass清空所有密码并禁止免密登录reset移除该用户的全部密码与访问权限category/-category授予 / 移除某个命令类别command/-command授予 / 移除单个命令支持command|subcommand形式~*/allkeys、resetkeys键模式占位当前仅支持通配符键模式源码中按 no-op 处理ACL 类别由 ACLParser.cs 中的映射表定义ACL CAT无参数时列出的正是这些类别admin、bitmap、blocking、connection、dangerous、geo、hash、hyperloglog、fast、keyspace、list、pubsub、read、scripting、set、sortedset、slow、stream、string、transaction、vector、write、garnet、custom、all其中all表示全部命令custom专门用于归类自定义扩展命令garnet是 Garnet 特有的类别。规则解析对类别名大小写不敏感OrdinalIgnoreCase并支持cmd与category混用叠加到同一用户。用户管理命令ACL SETUSER创建与修改用户ACL SETUSER username [rule [rule ...]]若用户名不存在则创建一个无任何权限的新用户然后从左到右应用所有规则若用户已存在则规则在原有权限基础上增量叠加。例如ACL SETUSER alice on pssw0rd all -dangerous -debug ACL SETUSER bob on nopass get set hash -hset实现要点见 ACLCommands.cs权限修改通过UserHandle.TrySetUser(newUser, currentUser)的 CAS 循环完成保证并发安全每条规则由ACLParser.ApplyACLOpToUser解析未知操作抛出ACLUnknownOperationException并回滚整条命令命令成功后返回OK失败返回-ERR ...。ACL DELUSER删除用户ACL DELUSER username [username ...]删除所有指定用户并终止所有以这些用户身份认证的连接。返回被删除用户数量的整数回复不存在的用户名不计入。注意default用户不可删除——AccessControlList.cs 中对此显式抛出异常 The special default user cannot be removed from the system。ACL USERS / ACL WHOAMI枚举与身份查询ACL USERS返回所有已配置用户的用户名数组Array replyACL WHOAMI返回当前连接所认证的用户名Bulk string reply。新连接默认认证为default可通过AUTH切换用户。ACL USERS的实现直接遍历AccessControlList.GetUserHandles()的用户名集合见 ACLCommands.cs。ACL GETUSER查看用户规则ACL GETUSER username返回指定用户的全部规则定义具体为一个包含三个字段的 mapArray reply实现见 ACLCommands.csflagson或off用户是否启用passwords密码哈希数组每个元素以#前缀形式给出commands该用户已启用命令的描述字符串。若用户不存在返回Nil reply。查询命令ACL CAT查看类别与类别内命令ACL CAT [category]无参数时返回所有 ACL 类别名上文列出的 25 个指定类别名时返回该类别下的全部 Garnet 命令。实现上直接使用ACLParser.ListCategories()与内部类别映射ACLCommands.cs。传入无效类别名会返回Simple error reply。ACL LIST查看当前生效的 ACL 规则ACL LIST返回服务器当前所有生效 ACL 规则的数组每个元素是一条可写回 ACL 文件的规则文本由User.DescribeUser()生成见 User.cs。这些规则可直接作为ACL SETUSER的参数或 ACL 文件的行内容使用。ACL GENPASS生成强随机密码ACL GENPASS [bits]输出一个足够强、可直接用作密码的随机二进制串的十六进制表示。默认生成 256 位即 64 个十六进制字符Bulk string reply。传入bits可调整长度位数会向上取整到 4 的倍数因此请求 1 位也会输出 1 个十六进制字符4 位。实现细节见 ACLCommands.cs当前仓库源码使用System.Security.Cryptography.RandomNumberGenerator.GetHexString生成随机串合法参数范围在代码中校验为大于 0 且不超过 4096 位文档描述的 1024 上限在实现中更为宽松以实际源码为准。参数非整数或越界时会返回对应-ERR。ACL 文件LOAD 与 SAVEACL LOAD与ACL SAVE仅在配置了--acl-file时可用否则返回ERR ACL authentication file not set之类的错误见ValidateACLFileUseACLCommands.cs。ACL LOAD原子化重载规则ACL LOAD从 ACL 文件重新加载全部规则替换服务器内存中的现有规则。其关键语义是全有或全无all-or-nothing文件每一行都合法则全部加载只要有一行非法则什么都不加载继续使用内存中的旧规则。该原子性在 AccessControlList.cs 的Load中实现先把文件解析进一个全新的临时AccessControlList解析成功后才一次性原子替换用户列表解析过程中任何ACLParsingException都会带上文件:行号信息抛出。加载后若文件中未定义default用户会自动补齐。成功返回OK失败返回-ERR 原因。ACL SAVE将内存规则写回文件ACL SAVE将当前内存中的全部用户规则通过User.DescribeUser()序列化写回 ACL 文件成功返回OK失败返回-ERR。实现位于 AccessControlList.cs使用lock保证同一时刻只有一次写盘先写满内存缓冲区再手动Flush避免频繁小写。自定义扩展命令的 ACL 规则除内置命令与category外Garnet 允许把单个自定义命令名直接作为规则使用此特性是 acl.md 中专门强调的扩展点json.set授予JSON.SET访问权-json.get拒绝JSON.GET逐命令的显式拒绝优先于类别级允许因此custom -json.set表示允许所有自定义命令、唯独拒绝JSON.SET名称匹配大小写不敏感内置命令优先级更高若名称被识别为内置命令或command|subcommand规则作用于内置命令即使某模块注册了同名自定义命令。ACL SETUSER在运行时是严格的name/-name中的名称若未在任何已加载模块中注册会被拒绝典型错误信息如Unknown custom command xxx (not registered with any loaded module)见 ACLCommands.cs。用户上已存在的名称例如模块注册前从 ACL 文件宽松加载进来的名称可在 allow/deny 间来回切换而不重新校验。ACL 文件加载默认同样严格启动时若文件引用了未注册的自定义命令名服务器将拒绝启动。若需要宽松的加载顺序例如模块注册晚于 ACL 文件解析可将--acl-strict-custom-commands设为false此时未解析的名称会原样保留并记录警告。从 ACLParser.cs 可以看到未知名称先以待解析状态挂在用户上待模块加载后统一解析——这也是该配置项存在的意义。自定义命令名的合法字符集为首字符为字母数字后续字符允许.、_、-、||用于镜像command|subcommand记号见IsValidCustomCommandNameACLParser.cs。验证与深入阅读命令实现ACLCommands.cs 覆盖全部 10 个子命令的网络层处理与参数校验规则解析ACLParser.cs 定义规则语法、类别表与自定义命令名校验用户模型User.cs 与 UserHandle.cs 承载权限状态与并发更新文件与默认用户AccessControlList.cs 实现原子化Load/Save与default用户自动创建配置项Options.cs 与 defaults.conf测试用例AclConfigurationFileTests.cs文件加载、默认用户补齐、密码优先级等场景、AclParserTests.cs规则语法解析。ACL 文件格式即为每行一条ACL LIST风格规则例如user default on nopass all user alice on secret123 all -dangerous -config|get user bob on #5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 get set在投入使用前建议先用ACL GETUSER核对规则、用ACL SAVE持久化并用 Garnet.test.acl 中的测试模式对多用户场景做完整验证。【免费下载链接】garnetGarnet is a remote cache-store from Microsoft Research that offers strong performance (throughput and latency), scalability, storage, recovery, cluster sharding, key migration, and replication features. Garnet can work with existing Redis clients.项目地址: https://gitcode.com/GitHub_Trending/garnet4/garnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/15 10:22:15

Spring Boot对象转换实战:从BeanUtils到MapStruct的全面指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/15 10:17:15

SpringBoot+Vue企业级旅游网站开发实战

1. 项目概述这个企业级旅游网站管理系统采用当前主流的前后端分离架构,后端基于SpringBoot框架构建,前端使用Vue.js实现,数据持久层采用MyBatis框架,数据库选用MySQL。整套系统源码完整,可直接用于商业项目开发或学习参…

2026/9/15 10:27:17

Markdown排版实战指南:从基础语法到工具链全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/15 10:27:17

Linux内核通知链(notifier chain)机制详解与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/15 10:27:17

Java启动Windows exe:ProcessBuilder封装与HTTP接口实现详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/15 10:27:17

网络数字暗语‘2222222‘的文化解析与应用

1. 关于"2222222"的常见误解与正确解读最近在各种社交平台上频繁出现的"2222222"引起了广泛讨论。作为一个长期观察网络文化现象的从业者,我想分享一下关于这个数字组合的几种常见解读方式及其背后的逻辑。1.1 数字重复现象的网络文化背景在中文…

2026/9/15 10:22:15

3步上手Escrcpy:图形化Android设备管理工具完整指南

3步上手Escrcpy:图形化Android设备管理工具完整指南 【免费下载链接】escrcpy 📱 Display and control your Android device graphically with scrcpy. 项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy 如果你调试、录屏或维护多台安卓…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码