资讯动态

Open Policy Agent Rego 速查指南:从规则、迭代到内置函数的实战精讲

发布时间:2026/9/24 14:30:37 来源:尧图企业网站定制
后端认证鉴权云原生【免费下载链接】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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价