Open Policy Agent Rego 速查指南:从规则、迭代到内置函数的实战精讲
后端认证鉴权云原生【免费下载链接】opaOpen Policy Agent (OPA) is an open source, general-purpose policy engine.项目地址https://gitcode.com/gh_mirrors/op/opa点击查看免费下载本指南以 Open Policy AgentOPA官方 Rego Cheat Sheet速查表为核心骨架系统梳理 Rego 语言的高频接触点三类规则写法、集合迭代some/every、逻辑控制流、with测试注入、print调试以及数组/集合/对象推导与常用内置函数。读者读完即可对照速查表快速写出可运行、可测试、可调试的 Rego 策略并理解其背后的求值器实现。从生态条目到完整速查表本文的定位在 OPA 仓库的生态目录中Rego Cheat Sheet 条目 将其定位为Quick reference for learning Rego学习 Rego 的快速参考归属于learning分类并明确说明它被设计为一份面向 Rego 学习者和使用者的语言参考记录与该语言最常见的接触点同时提供 PDF 版本 供打印使用。该条目指向的完整内容正是仓库内的 docs/docs/cheatsheet.md全篇所有示例共享同一段前言package cheat下文所有示例均假定位于该 package 之下并可通过data.cheat查询如opa eval --data policy.rego data.cheat。速查表的各小节在仓库的 topdown 求值器 中均有对应的实现与测试支撑本文会在关键处补充源码级说明。RulesRego 的构建基石Rego 策略由规则rule构成速查表把规则分为三类单值规则Single-Value Rules、多值集合规则Multi-Value Set Rules与多值对象规则Multi-Value Object Rules。单值规则Single-Value Rules单值规则为变量赋予单个值旧文档中也称完整规则complete rules。它适合表达满足条件时输出某个确定值的场景{ user: { role: admin, internal: true } }default allow : false allow if { input.user.role admin input.user.internal } default request_quota : 100 request_quota : 1000 if input.user.internal request_quota : 50 if input.user.plan.trial要点说明default关键字为规则提供兜底值避免在条件全部不满足时规则未定义undefined。allow与request_quota都声明了default保证查询结果总是有值。同一名称的单值规则可以存在多个定义每个定义带自己的条件求值时自上而下寻找第一个条件成立的实例。从源码结构看OPA 编译器在 ast/ast.go 中区分SingleValue与MultiValue规则类型并据此走不同的求值路径。多值集合规则Multi-Value Set Rules多值集合规则为变量生成并绑定一个集合set旧文档称部分集合规则partial set rules。集合中的元素去重且无序适合表达允许的路径清单这类累积式授权{ user: { teams: [ ops, eng ] } }paths contains /handbook/* paths contains path if { some team in input.user.teams path : sprintf(/teams/%v/*, [team]) }要点说明使用contains关键字向集合追加元素paths最终包含两个成员固定的/handbook/*与按用户所属团队动态生成的路径。sprintf用于字符串格式化%v是通用占位符。查询data.cheat.paths得到的是一个集合外部消费方无需关心成员顺序。多值对象规则Multi-Value Object Rules多值对象规则为变量生成并绑定一组键值对旧文档称部分对象规则partial object rules。键名写在方括号中键后通过contains追加值。经典用法是对输入数据做分组聚合{ paths: [ a/123.txt, a/456.txt, b/foo.txt, b/bar.txt, c/x.txt ] }# Creates an object with sets as the values. paths_by_prefix[prefix] contains path if { some path in input.paths parts : split(path, /) prefix : parts[0] }要点说明本例按路径的第一个分段a、b、c把全部路径分组得到paths_by_prefix其值类型是集合。split将字符串按分隔符拆分为数组再取下标0作为分组键。键必须唯一同一键名下的多个分支会合并到同一个值集合中。Iteration快速处理集合速查表用两个关键字覆盖最常见的迭代场景some局部变量绑定与every全量断言。Some命名局部查询变量some在规则体内引入局部变量可同时解构键-值对或逐元素遍历集合all_regions : { emea: {west, east}, na: {west, east, central}, latam: {west, east}, apac: {north, south}, } allowed_regions contains region_id if { some area, regions in all_regions some region in regions region_id : sprintf(%s_%s, [area, region]) }要点说明some area, regions in all_regions同时绑定对象的键与值some region in regions再对每个值集合逐元素迭代。最终allowed_regions是一个包含emea_west、na_central等全部排列组合的集合。Every对每个元素断言every要求指定范围内的每个元素都满足内部条件只要有一个不满足规则即失败。非常适合校验集合内所有路径都属于用户目录这类全量检查{ userID: u123, paths: [ /docs/u123/notes.txt, /docs/u123/q4-report.docx ] }allow if { prefix : sprintf(/docs/%s/, [input.userID]) every path in input.paths { startswith(path, prefix) } }实现层面的佐证every语句在 v1/topdown/eval.go 中被编译为*ast.Every节点并由evalEvery求值器执行——它内部对集合做全量展开任一元素失败即整体失败。这与速查表描述的检查多个元素上的条件完全一致。Control Flow处理不同条件逻辑与Logical AND规则体内的多条语句以逻辑与连接所有语句必须同时成立规则才成立。速查表用邮箱校验示例说明这一点——格式匹配与域名后缀检查缺一不可{ email: joeexample.com }valid_staff_email if { regex.match(^\S\S\.\S$, input.email) # and endswith(input.email, example.com) }要点说明两条语句之间是隐式and语义等价于格式合法且域名属于 example.com。反引号包裹的是 Rego 原始字符串用于书写正则避免转义地狱。regex.match在 v1/topdown/regex.go 中实现并注册为内置函数。逻辑或Logical ORRego 没有显式的or关键字速查表给出三种等效写法多条同名规则、函数式规则与in关键字{ email: opaexample.com, name: anna, method: GET }# using multiple rules valid_email if endswith(input.email, example.com) valid_email if endswith(input.email, example.org) valid_email if endswith(input.email, example.net) # using functions allowed_firstname(name) if { startswith(name, a) count(name) 2 } allowed_firstname(joe) # if name joe valid_name if allowed_firstname(input.name) valid_request if { input.method in {GET, POST} # using in }要点说明三条valid_email规则是或关系任一规则条件满足即通过。allowed_firstname是带参数的函数式规则可被其他规则调用第二行allowed_firstname(joe)是规则内的无 body 事实式写法等价于当 name 为 joe 时恒为真。in关键字用于判断元素是否属于集合是表达白名单最简洁的方式。Testing用 with 注入测试数据Rego 测试通过test_前缀命名规则速查表重点展示了with关键字——它可以在求值规则时临时覆盖input或data从而无需真实请求即可验证策略行为allow if input.admin true test_allow_when_admin if { allow with input as {admin: true} }要点说明allow with input as {admin: true}表示在input被替换为{admin: true}的前提下求值allow。测试规则返回真即测试通过配合opa test policy_test.rego即可纳入 CI。with同样支持覆盖data路径如rule with data.some.path as {...}方便在测试中注入外部数据。Debugging用 print 观察运行时值速查表推荐在规则中使用print在运行时输出变量值这是定位为什么这条规则没通过的最直接手段allowed_users : {alice, bob} allow if { some user in allowed_users print(user) input.user user }实现层面的佐证v1/topdown/print.go 中的builtinPrint通过PrintHook输出消息若未配置 hook 则静默返回、不影响规则结果——这保证了print可以放心留在生产策略中。print会以空格连接多个参数并自动展开集合/数组笛卡尔积形式便于一次性查看多种取值组合。Comprehensions加工与重组集合推导式comprehension从既有集合派生新值速查表给出三种形态。数组推导保序且允许重复doubled : [m | some n in [1, 2, 3, 3] m : n * 2 ]结果[2, 4, 6, 6]——数组是有序集合重复元素被保留。集合推导去重且无序unique_doubled contains m if { some n in [10, 20, 30, 20, 10] m : n * 2 }结果{20, 40, 60}——集合自动去重适合需要唯一值的语义。对象推导键必须唯一is_even[number] : is_even if { some number in [1, 2, 3, 4] is_even : (number % 2) 0 }结果{1: false, 2: true, 3: false, 4: true}——注意推导出的对象键必须唯一否则会引发错误。Builtins常用内置函数速查表将高频内置函数分为四组全部在 v1/topdown 下实现覆盖正则、字符串、聚合与对象操作。正则匹配与替换example_string : Build Policy as Code with OPA! check_match if regex.match(\w, example_string) check_replace : regex.replace(example_string, \s, _)regex.match(pattern, value)判断是否匹配v1/topdown/regex.go。regex.replace(value, pattern, replacement)用替换串替换所有匹配片段上例把空白符替换为下划线。字符串检查与变换example_string : Build Policy as Code with OPA! check_contains if contains(example_string, OPA) check_startswith if startswith(example_string, Build) check_endswith if endswith(example_string, !) check_replace : replace(example_string, OPA, OPA!) check_sprintf : sprintf(OPA is %s!, [awesome])contains/startswith/endswith子串与前后缀判断。replace普通字符串替换区别于正则版regex.replace。sprintf格式化输出占位符与参数数组一一对应。聚合数据汇总vals : [5, 1, 4, 2, 3] vals_count : count(vals) vals_max : max(vals) vals_min : min(vals) vals_sorted : sort(vals) vals_sum : sum(vals)一组数据经此即可得到数量、最大/最小值、排序结果与总和是策略中做阈值判断如配额、频率限制的基础。对象提取数据obj : {userid: 18472, roles: [{name: admin}]} # paths can contain array indexes too val : object.get(obj, [roles, 0, name], missing) defaulted_val : object.get( obj, [roles, 0, permissions], # path unknown, # default if path is missing ) keys : object.keys(obj)object.get(obj, path, default)沿路径可含数组下标安全取值路径不存在时返回默认值——避免undefined导致整条规则失败。实现在 v1/topdown/object.go 的builtinObjectGet。object.keys(obj)返回对象的键集合。对象变换数据unioned : object.union({foo: true}, {bar: false}) subset : object.subset( {foo: true, bar: false}, {foo: true}, # subset object ) removed : object.remove( {foo: true, bar: false}, {bar}, # remove keys )object.union(a, b)合并两个对象键冲突时后者覆盖builtinObjectUnion采用 merge-with-overwrite 语义见 v1/topdown/object.go。object.subset(a, b)判断b是否为a的子集除对象外还支持集合、数组及数组超集 vs 集合子集的组合见 v1/topdown/subset.go 的builtinObjectSubset。object.remove(obj, keys)按键集合移除成员builtinObjectRemove同样位于 v1/topdown/object.go。使用建议与延伸阅读上手练习可直接在 OPA Playground 中运行速查表每个示例打印友好的参考可获取 docs/static/cheatsheet.pdf。测试策略用opa test结合本文with关键字示例即可构建无外部依赖的单元测试。想深入了解规则编译与求值可继续阅读 ast/ast.go规则类型与every语法节点、v1/topdown/eval.goevalEvery求值以及 v1/topdown/object.go、v1/topdown/subset.go、v1/topdown/print.go 等内置函数实现。完整语言参考见仓库内 docs/docs/policy-language.md命令用法见 docs/docs/cli.md。速查表的价值在于最短路径上手三类规则 两种迭代 with/print 推导式 常用内置函数已能覆盖绝大多数日常策略编写需求再结合本文提供的源码路径即可从会写走向理解为什么。赞分享后端认证鉴权云原生【免费下载链接】opaOpen Policy Agent (OPA) is an open source, general-purpose policy engine.项目地址https://gitcode.com/gh_mirrors/op/opa点击查看免费下载相关推荐Open Policy Agent Rego 速查手册从规则骨架到集合推导与内置函数的完整语法指南Open Policy Agent Rego 速查手册从规则骨架到集合推导与内置函数的完整语法指南 本文以 OPA 官方仓库中的 Rego 速查表 https后端认证鉴权云原生Open Policy Agent Rego 语言参考手册赋值、查找、迭代、规则、关键字与完整语法Open Policy Agent Rego 语言参考手册赋值、查找、迭代、规则、关键字与完整语法 本篇文章是 Open Policy Agent OPA 中后端认证鉴权云原生Open Policy Agent 2020 年度回顾从 bundle 签名到 Wasm 与 Rego 内置函数的全面演进Open Policy Agent 2020 年度回顾从 bundle 签名到 Wasm 与 Rego 内置函数的全面演进 2020 年是 Open Poli后端认证鉴权云原生上一篇ECMA-262 规范源码仓库实战指南从 spec.html 构建 ECMAScript 规范、提案协作与贡献流程下一篇免费开源的显存测试工具 memtest_vulkan5 分钟揪出显卡隐疾创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Jackett 完整指南:如何快速把上百个种子站接入你的下载流程

Jackett 完整指南:如何快速把上百个种子站接入你的下载流程

Jackett 完整指南:如何快速把上百个种子站接入你的下载流程 一句话定位:Jackett 是一个开源的 Torznab 代理服务器,把上百个公共、半私人和私人种子站统一在一个 Web 后台里管理,让 Sonarr、Radarr 等应用只用一套标准接口就能完成跨站搜索与自动下载。 如果你用过 Sonarr 或…

2026/9/24 14:30:52 阅读更多 →
FPGA高速接收核心:ISERDES原语原理与动态相位校准实战

FPGA高速接收核心:ISERDES原语原理与动态相位校准实战

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

2026/9/24 14:30:52 阅读更多 →
计算机系统---CPU的进程与线程处理

计算机系统---CPU的进程与线程处理

在计算机系统中,CPU作为“运算核心”是通过进程与线程这两个抽象层,实现对海量任务的有序调度、资源隔离与高效并发。 理解CPU如何处理进程与线程,本质是理解操作系统如何“管理任务”与“分配算力”——这一过程覆盖了资源定义、状态流转、调…

2026/9/24 14:30:52 阅读更多 →

最新新闻

AWS SDK for C++ 跨服务示例全解析:从 Aurora Serverless 任务追踪器到 SNS/SQS 发布订阅

AWS SDK for C++ 跨服务示例全解析:从 Aurora Serverless 任务追踪器到 SNS/SQS 发布订阅

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地…

2026/9/24 16:37:44 阅读更多 →
关于电缆标签

关于电缆标签

1.电缆按照树结构分 2,隐藏电缆高层代号3.页—页宏–插入 导入宏文件 线缆标签名称自动生成 线缆标签不重复

2026/9/24 16:37:44 阅读更多 →
PHPStan 错误标识符 requireImplements.deprecatedClass 详解:`@phpstan-require-implements` 引用已废弃类时的检测与修复

PHPStan 错误标识符 requireImplements.deprecatedClass 详解:`@phpstan-require-implements` 引用已废弃类时的检测与修复

PHPStan 错误标识符 requireImplements.deprecatedClass 详解:phpstan-require-implements 引用已废弃类时的检测与修复 【免费下载链接】phpstan PHP Static Analysis Tool - discover bugs in your code without running it! 项目地址: https://gitcode.com/gh_…

2026/9/24 16:37:43 阅读更多 →
优秀的项目经理,从来不靠记忆力跟进项目进度

优秀的项目经理,从来不靠记忆力跟进项目进度

很多管理者每天极度内耗: 靠着大脑死记几十项任务、记每个节点工期、记谁的工作没完成、记哪里存在卡点。 真正资深、能同时掌控多个项目的项目经理,往往一点都不忙乱。不是他们记忆力更强、精力更充沛,而是他们早就戒掉了靠记忆管理项目的低…

2026/9/24 16:37:43 阅读更多 →
如何自动识别文件编码?chardet4cj 字符编码检测库新手完全入门指南

如何自动识别文件编码?chardet4cj 字符编码检测库新手完全入门指南

如何自动识别文件编码?chardet4cj 字符编码检测库新手完全入门指南 【免费下载链接】chardet4cj 一个用于检测常用文本编码的库 项目地址: https://gitcode.com/Cangjie-TPC/chardet4cj 打开一个来路不明的文本文件,却看到满屏乱码?这…

2026/9/24 16:37:43 阅读更多 →
如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南

如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南

如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南 【免费下载链接】alipay_sdk_cj AliPay Sdk for 仓颉 支付宝接口后端sdk,方便cangjie开发者快速接入支付宝的支付接口(目前只支持最广泛使用的商户直接接入模式,只支持最…

2026/9/24 16:36:43 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →