什么是 Speedle 嵌入模式
区别于 Speedle 服务模式,Speedle 嵌入模式把 Speedle 的策略决策引擎嵌入到调用者进程内部,作为进程的一部分运行。调用者可以直接调用 Speedle 的 API 获得策略决策的结果。
嵌入模式的局限
- 只支持 Golang,推荐使用 Golang 1.10。
- 只接受文件存储策略。
如何使用嵌入模式
把 Speedle 代码添加到你的工程中
在嵌入模式中,需要先将 Speedle 源代码从代码仓库中下载下来。主要有一下几种方式:
- 使用 go get
go get github.com/teramoby/speedle-plus
- 使用 dep 工具
在你的 Gopkg.toml 文件中添加以下几行
[[constraint]]
name = "github.com/teramoby/speedle-plus"
branch = "master"
使用 dep 工具将 Speedle 源代码添加到vendor
目录下:
dep ensure -update github.com/teramoby/speedle-plus
在代码中初始化一个 Evalautor 实例
方法func eval.NewFromFile(loc string, isWatch bool) (ads.PolicyEvaluator, error)
使用一个策略定义文件初始化一个 Evaluator 实例。该方法接受两个参数:
- loc:决策定义文件的路径。支持两种决策文件格式:JSON 格式和 SPDL 格式。
- isWatch: 如果值为
true
,当策略定义文件发生改动,Speedle 决策引擎能自动以最新的文件内容进行决策。如果值为false
,Speedle 决策引擎不监视策略定义文件的任何改动。
该方法返回一个 Evaluator 示例。
以下代码片段展示如何初始化一个 Evaluator 实例。
import (
"github.com/teramoby/speedle-plus/pkg/eval"
)
func foo() {
eval, err := evaluator.NewFromFile(spdlLoc, true)
}
调用 Evaluator API 进行决策
方法func ads.IsAllowed(c ads.RequestContext) (allowed bool, reason Reason, err error)
依据策略定义文件中定义的策略进行决策。
该方法接受一个参数ads.RequestContext
,该结构的定义如下:
typedef RequestContext {
Subject *ads.Subject // Subject包含用户信息,用户名,组名等。
ServiceName string // Speedle Service
Resource string // Resource Name
Action string // Action Name
Attributes map[string]interface{} // Attributes
}
该方法有 3 个返回值:
- allowed bool:
true
,Subject
指定的用户有权限操作资源(Action, Resource)。false
,没有权限操作资源(Action, Resource)。 - reason Reason: 做出决策的原因。
- err error: 决策过程中出现的异常。如果没有异常,返回 nil。
嵌入模式的例子
例子可以在 https://github.com/teramoby/speedle-plus/tree/master/samples/embedded/expenses 中找到。