简介

官网介绍

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 > { ... }
  • 不声明返回值,则只返回true或false

    • 格式2 < Name > = < Value > { ... }
  • 声明返回值 < Value > 则返回其值
  • 规则体内每条描述会逐条And运算,全部成立才会返回值
  • 多条同名规则相互之间是Or运算,满足其一即可

具体到代码中规则allow, 默认值是false

要求user_has_rolerole_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策略引擎用法实战相关推荐

  1. twig模板引擎使用php,Twig模板引擎用法入门教程_PHP

    本文实例讲述了Twig模板引擎用法.分享给大家供大家参考,具体如下: 介绍 Twig是一个灵活.高效并且安全的PHP模板引擎. 如果你使用过Smarty.Django或者Jinja这类基于文本的模板引 ...

  2. 神策数据关海南:营销策略引擎解读,以平台化构建营销新生态

    在神策 2021 数据驱动大会现场,神策营销云架构师关海南发表了题为<营销策略引擎(Express)的技术演进>的演讲.本文根据其演讲整理,核心内容如下: 营销中台下的策略引擎 营销策略引 ...

  3. VTK:ShareCamera分享相机用法实战

    VTK:ShareCamera分享相机用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCamera ...

  4. VTK:阴影灯用法实战

    VTK:阴影灯用法实战 程序输出 程序完整源代码 程序输出 场景包括 // * 4 个actors:一个矩形.一个盒子.一个圆锥体和一个球体. 长方体.圆锥体和球体位于矩形上方. // * 2 个聚光 ...

  5. VTK:baking烘焙阴影贴图用法实战

    VTK:baking烘焙阴影贴图用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCamera.h& ...

  6. VTK:选择可见点用法实战

    VTK:选择可见点用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkInteractorStyleT ...

  7. VTK:vtkSelectPolyData选择多数据用法实战

    VTK:vtkSelectPolyData选择多数据用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkClipPolyData.h> #include ...

  8. VTK:选定的顶点和边用法实战

    VTK:选定的顶点和边用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkAnnotationLink.h> #include <vtkDoubl ...

  9. VTK:vtkSeedWidget种子小部件用法实战

    VTK:vtkSeedWidget种子小部件用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkNamedColors.h> #include < ...

最新文章

  1. 伤疤好了有黑印怎么办_搞笑gif动态图片:“发现相亲对象的闺蜜更有实力,我后悔了”哈哈哈好一个见色起意...
  2. 第十、十一周项目-阅读程序,写出这些程序的运行结果(4)
  3. python中对list去重的多种方法
  4. 你需要的git命令大全来了
  5. python bind sock_python 在bind端口之后创建的socket如果不关闭的话会被回收吗?
  6. mysql中数据定义语言_SQL数据定义语言(DDL)
  7. 想当老板的人,三点特征很重要(转)
  8. django 1.8 官方文档翻译: 3-5-1 使用Django输出CSV
  9. ADS仿真目标参数调谐与目标优化 ----tuner和goal控件使用
  10. C++实现设计模式——Builder模式
  11. Apache详细的安装和配置
  12. 访问chm文件出现 已取消到该网页的导航的解决方法
  13. python如何调用pyd_C#调用pyd的方法
  14. 不重视需求过程的项目队伍将自食其果
  15. Hibernate 多对多的增删改查。
  16. RN8215芯片 32768Hz晶体停振案例分析
  17. 护理管理学选择题汇总(人卫第三版)
  18. 谷歌提出MaskGIT:掩码生成图像Transformer
  19. .Net 中使用Farpoint Web Spread 自定义CellType
  20. latex表格内容上下居中_LaTex表格内单元格内容换行

热门文章

  1. 阿里云实人认证生成签名SignNature工具类
  2. 折分查找法递归和非递归方式
  3. 一周内,被闲鱼疯转2.6W次,最终被所有平台封杀!
  4. C# Action 使用
  5. android 触控优化,太滑手了,安卓这款触控优化神器要逆天!
  6. 揭秘小程序上线不到一周,每天2万销售额,究竟怎么做到的?
  7. 何为 Token?什么是基于 token 的认证?
  8. 【贪心】加工生产调度(双机调度贪心问题)
  9. MySQL NDB Cluster 搭建
  10. 日常生活息息相关的数据分析应用,掌握了你就是最牛的数据分析师