OPA策略引擎用法实战
简介
官网介绍
OPA简单的说就是一个功能强大的策略规则引擎,开发的时候多少会遇到一些多样的规则配置,这些配置不足以写到数据库,所以都写到了代码中、配置文件中。项目做大的时候,如果需要修改规则,那么只能重新修改代码,打包发布,相对比较麻烦,还增加了业务的复杂度,这个时候OPA的作用就出来了,它可以把这些配置的的东西独立出来,让规则脱离主业务逻辑。
安装
OPA是一个很简单的东西,直接下载放到Linux的sbin下就能直接使用了
macOS (64-bit): https://openpolicyagent.org/downloads/latest/opa_darwin_amd64
Linux下载:https://openpolicyagent.org/downloads/latest/opa_linux_amd64
以Linux为例,把名称修改下 opa_linux_amd64 改为 opa,然后设置文件可执行,再然后丢到/usr/bin目录下就能用了。
# Ubuntu 默认下载到 Downloads 目录下面
# 剪切刚才下载的opa可执行文件到 /usr/bin/目录下,并且重命名为 opa
sudo mv opa_linux_amd64 /usr/bin/opa# 赋予它可执行权限
sudo chmod +x opa# 测试
opa 回车tommy@tommy-Vostro-3900:~/Downloads$ opa
An open source project to policy-enable your service.Usage:opa [command]Available Commands:bench Benchmark a Rego querybuild Build an OPA bundlecheck Check Rego source filesdeps Analyze Rego query dependencieseval Evaluate a Rego queryfmt Format Rego source fileshelp Help about any commandparse Parse Rego source filerun Start OPA in interactive or server modesign Generate an OPA bundle signaturetest Execute Rego test casesversion Print the version of OPAFlags:-h, --help help for opaUse "opa [command] --help" for more information about a command.
实测
OPA官方给出了一个在线测试的地址
测试地址
实战
语法规则
基本语法
OPA基于一种数据查询语言实现了描述语言Rego
OPA的Rego基本语法如下表:
语法 | 例子 |
上下文 | data |
输入 | input |
索引取值 | data.bindings[0] |
比较 | “alice” == input.subject.user |
赋值 | user := input.subject.user |
规则 | < Header > { < Body > } |
规则头 | < Name > = < Value > { … } 或者 < Name > { … } |
规则体 | And运算的一个个描述 |
多条同名规则 | Or运算的一个规则 |
规则默认值 | default allow = false |
函数 | fun(x) { … } |
虚拟文档 | doc[x] { … } |
rule
当定义规则时:
- 每条规则都会有返回值
- 格式1:
< Name > { ... }
- 格式1:
- 不声明返回值,则只返回true或false
- 格式2
< Name > = < Value > { ... }
- 格式2
- 声明返回值
< Value >
则返回其值 - 规则体内每条描述会逐条
And
运算,全部成立才会返回值 - 多条同名规则相互之间是
Or
运算,满足其一即可
具体到代码中规则allow
, 默认值是false
要求user_has_role
和role_has_permission
同时满足
两者的role_name
也是一样。
你可能发现,局部变量role_name
没声明啊!
Rego
里可以省略声明局部变量, 直接使用。
事例
规则描述
高考中规定的分数线,不同城市的本科分数线是不一样的,小明考试查询下分数,需要往系统录入考试城市,以及考试分数,用来查询,即:
{"alias": "shenzhen","score": 600
}
规则数据Data
{"achievement": {"shenzhen": {"yiben": {"score": 600},"erben": {"score": 500}},"guangzhou":{"yiben": {"score": 620},"erben": {"score": 520}}}
规则逻辑代码
package app.rbac# 查询分数线是否满足条件
result = {"score_line": 1, "msg": "恭喜你考上一本"} {data.achievement[input.alias].yiben.score <= input.score
} else = {"score_line": 2, "msg": "恭喜你考上二本"}{data.achievement[input.alias].erben.score <= input.score
} else = {"score_line": -1, "msg": "没考上"}
运行测试结果
本地opa跑代码
创建一个文件夹 tommy 然后在tommy文件夹下再创建 tommytest 把三个文件丢到tommytest目录下
文件名称随意,标准的是:input.json data.json policy.rego
文件内容分别为:
input.json文件
{"alias": "shenzhen","score": 600
}
data.json文件
{"achievement": {"shenzhen": {"yiben": {"score": 600},"erben": {"score": 500}},"guangzhou": {"yiben": {"score": 620},"erben": {"score": 520}}}
}
package tommytest# 查询分数线是否满足条件
result = {"score_line": 1, "msg": "恭喜你考上一本"} {data.tommytest.achievement[input.alias].yiben.score <= input.score
} else = {"score_line": 2, "msg": "恭喜你考上二本"}{data.tommytest.achievement[input.alias].erben.score <= input.score
} else = {"score_line": -1, "msg": "没考上"}
然后,回到tommy文件夹目录,执行命令
opa eval --bundle . -i tommytest/input.json 'data.tommytest.result'# 返回的结果
{"result": [{"expressions": [{"value": {"msg": "恭喜你考上一本","score_line": 1},"text": "data.tommytest.result","location": {"row": 1,"col": 1}}]}]
}
OPA策略引擎用法实战相关推荐
- twig模板引擎使用php,Twig模板引擎用法入门教程_PHP
本文实例讲述了Twig模板引擎用法.分享给大家供大家参考,具体如下: 介绍 Twig是一个灵活.高效并且安全的PHP模板引擎. 如果你使用过Smarty.Django或者Jinja这类基于文本的模板引 ...
- 神策数据关海南:营销策略引擎解读,以平台化构建营销新生态
在神策 2021 数据驱动大会现场,神策营销云架构师关海南发表了题为<营销策略引擎(Express)的技术演进>的演讲.本文根据其演讲整理,核心内容如下: 营销中台下的策略引擎 营销策略引 ...
- VTK:ShareCamera分享相机用法实战
VTK:ShareCamera分享相机用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCamera ...
- VTK:阴影灯用法实战
VTK:阴影灯用法实战 程序输出 程序完整源代码 程序输出 场景包括 // * 4 个actors:一个矩形.一个盒子.一个圆锥体和一个球体. 长方体.圆锥体和球体位于矩形上方. // * 2 个聚光 ...
- VTK:baking烘焙阴影贴图用法实战
VTK:baking烘焙阴影贴图用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCamera.h& ...
- VTK:选择可见点用法实战
VTK:选择可见点用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkInteractorStyleT ...
- VTK:vtkSelectPolyData选择多数据用法实战
VTK:vtkSelectPolyData选择多数据用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkClipPolyData.h> #include ...
- VTK:选定的顶点和边用法实战
VTK:选定的顶点和边用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkAnnotationLink.h> #include <vtkDoubl ...
- VTK:vtkSeedWidget种子小部件用法实战
VTK:vtkSeedWidget种子小部件用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkNamedColors.h> #include < ...
最新文章
- 伤疤好了有黑印怎么办_搞笑gif动态图片:“发现相亲对象的闺蜜更有实力,我后悔了”哈哈哈好一个见色起意...
- 第十、十一周项目-阅读程序,写出这些程序的运行结果(4)
- python中对list去重的多种方法
- 你需要的git命令大全来了
- python bind sock_python 在bind端口之后创建的socket如果不关闭的话会被回收吗?
- mysql中数据定义语言_SQL数据定义语言(DDL)
- 想当老板的人,三点特征很重要(转)
- django 1.8 官方文档翻译: 3-5-1 使用Django输出CSV
- ADS仿真目标参数调谐与目标优化 ----tuner和goal控件使用
- C++实现设计模式——Builder模式
- Apache详细的安装和配置
- 访问chm文件出现 已取消到该网页的导航的解决方法
- python如何调用pyd_C#调用pyd的方法
- 不重视需求过程的项目队伍将自食其果
- Hibernate 多对多的增删改查。
- RN8215芯片 32768Hz晶体停振案例分析
- 护理管理学选择题汇总(人卫第三版)
- 谷歌提出MaskGIT:掩码生成图像Transformer
- .Net 中使用Farpoint Web Spread 自定义CellType
- latex表格内容上下居中_LaTex表格内单元格内容换行