Golang实现ABAC权限控制模型

Golang实现ABAC权限控制模型 有人能给我提供在 Golang 中使用 Casbin 或其他工具实现 ABAC 的代码示例吗?

1 回复

更多关于Golang实现ABAC权限控制模型的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是使用 Casbin 在 Golang 中实现 ABAC(基于属性的访问控制)模型的完整示例。ABAC 允许您根据用户、资源和环境属性定义动态权限策略。

1. 安装 Casbin

首先,使用以下命令安装 Casbin:

go get github.com/casbin/casbin/v2

2. 定义 ABAC 模型和策略

创建一个模型文件(如 abac_model.conf)来定义 ABAC 规则:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == r.obj.Owner

此模型检查请求主题(例如用户)是否与资源的所有者属性匹配。

3. 实现 Golang 代码

在 Golang 中,使用 Casbin 强制执行 ABAC 策略。以下是一个完整的示例:

package main

import (
	"fmt"
	"log"

	"github.com/casbin/casbin/v2"
)

// 定义资源结构,包含 Owner 属性
type Resource struct {
	Name  string
	Owner string
}

func main() {
	// 加载模型和策略(这里使用内联策略进行演示)
	enforcer, err := casbin.NewEnforcer(`
		[request_definition]
		r = sub, obj, act

		[policy_definition]
		p = sub, obj, act

		[policy_effect]
		e = some(where (p.eft == allow))

		[matchers]
		m = r.sub == r.obj.Owner
	`, `
		p, alice, data1, read
		p, bob, data2, write
	`)
	if err != nil {
		log.Fatalf("Error creating enforcer: %v", err)
	}

	// 定义测试资源
	resource1 := Resource{Name: "data1", Owner: "alice"}
	resource2 := Resource{Name: "data2", Owner: "bob"}

	// 测试访问控制
	tests := []struct {
		user     string
		resource Resource
		action   string
	}{
		{"alice", resource1, "read"},
		{"bob", resource2, "write"},
		{"alice", resource2, "write"}, // 应该被拒绝
	}

	for _, test := range tests {
		allowed, err := enforcer.Enforce(test.user, test.resource, test.action)
		if err != nil {
			log.Printf("Enforce error: %v", err)
			continue
		}
		fmt.Printf("User %s attempting %s on resource %s (Owner: %s): %t\n",
			test.user, test.action, test.resource.Name, test.resource.Owner, allowed)
	}
}

4. 运行和输出

运行此代码将产生以下输出:

User alice attempting read on resource data1 (Owner: alice): true
User bob attempting write on resource data2 (Owner: bob): true
User alice attempting write on resource data2 (Owner: bob): false

5. 扩展 ABAC 属性

要处理更复杂的属性(如环境条件),可以扩展模型。例如,修改 abac_model.conf 以包含时间限制:

[matchers]
m = r.sub == r.obj.Owner && r.obj.AccessTime > 900 && r.obj.AccessTime < 1700

并在资源结构中添加 AccessTime 字段。

此示例展示了如何使用 Casbin 在 Golang 中实现基本的 ABAC。您可以根据需要调整模型和策略,以包含更多属性(如部门、位置或自定义条件)。

回到顶部