0
点赞
收藏
分享

微信扫一扫

[golang]利用casbin做常规的权限控制

Casbin是一个流行的Go语言开源权限管理库,用于实现基于角色的访问控制(RBAC)模型和其他常见的访问控制模型。它提供了一种简单而强大的API,可用于定义和执行各种类型的策略,包括访问控制列表(ACL)、角色访问控制(RBAC)和层次授权(ABAC)等。在本文中,我们将介绍Casbin的核心概念、使用方法和常见场景。

核心概念

模型(Model)

Casbin的模型是指访问控制模型,它定义了用于规范化策略的基本结构。它由三个部分组成:

  1. 对象(Object):要保护的资源或操作。
  2. 主体(Subject):试图访问资源或操作的用户或服务。
  3. 动作(Action):主体对对象执行的操作。

例如,在Web应用程序中,模型可以定义如下:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

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

[matchers]
m = r.sub == g(sub, obj) && r.obj == p.obj && r.act == p.act

以上代码定义了一个名为model.conf的模型文件,其中包含了四个命令:

  • request_definition:定义请求的结构。
  • policy_definition:定义策略的结构。
  • role_definition:定义角色的结构。
  • matchers:定义匹配规则。

策略(Policy)

Casbin的策略是指访问控制规则,它对模型中定义的对象、主体和动作进行了实际匹配。它由多个规则组成,每个规则代表一种访问权限。例如,在Web应用程序中,策略可以定义如下:

p, alice, data1, read
p, bob, data2, write
g, alice, admin

以上代码表示了三条策略规则:

  • p, alice, data1, read:允许Alice读取Data1资源。
  • p, bob, data2, write:允许Bob写入Data2资源。
  • g, alice, admin:将Alice分配到Admin角色中。

角色(Role)

Casbin的角色是指用户或服务的集合,他们共享一组相同的权限。这通常是通过将多个主体分配到一个角色上来实现的。例如,在Web应用程序中,角色可以定义如下:

alice, admin
bob, member

以上代码表示将Alice分配到Admin角色中,将Bob分配到Member角色中。

使用方法

使用Casbin的基本步骤如下:

  1. 定义模型和策略。

您可以使用Casbin提供的模型编辑器或手动创建文件来定义模型和策略。

  1. 加载模型和策略。

使用Casbin提供的API,将模型和策略加载到内存中。例如:

e, err := casbin.NewEnforcer("model.conf", "policy.csv")

  1. 执行访问控制检查。

使用Casbin提供的API,根据请求的对象、主体和动作执行访问控制检查。例如:

allowed, err := e.Enforce("alice", "data1", "read")

在以上代码中,我们检查Alice是否有读取Data1的权限。

常见场景

Casbin适用于各种不同的访问控制场景,包括但不限于:

  • Web应用程序:角色基础的访问控制(RBAC)。
  • 数据库和API:层次授权(ABAC)。
  • 云计算:多租户访问控制、基于策略的访问控制。
  • 数据库:行级访问控制、列级访问控制。
  • 例如,在Web应用程序中,Casbin可用于实现以下功能:
  • 限制用户对不同页面或API端点的访问权限。
  • 管理角色和权限。
  • 记录所有用户的活动并进行审计。
  • 实现基于策略的访问控制。

总之,Casbin是一个灵活且功能强大的开源权限管理库,它可以帮助您实现各种类型的访问控制需求。通过使用Casbin,您可以轻松地定义模型和策略,并在运行时执行访问控制检查。如果您正在寻找一种可靠的权限管理解决方案,请考虑使用Casbin。

以下是一个使用Golang和Casbin实现基于角色的访问控制(RBAC)的示例:

package main

import (
	"github.com/casbin/casbin/v2"
	"github.com/casbin/casbin/v2/model"
	"github.com/casbin/casbin/v2/persist/file-adapter"
)

func main() {
	// 1. 定义模型和策略
	modelText := `
	[request_definition]
	r = sub, obj, act

	[policy_definition]
	p = sub, obj, act

	[role_definition]
	g = _, _

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

	[matchers]
	m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
	`
	m, _ := model.NewModelFromString(modelText)
	a := fileadapter.NewAdapter("policy.csv")

	// 2. 加载模型和策略
	e, _ := casbin.NewEnforcer(m, a)

	// 3. 添加角色和权限
	e.AddGroupingPolicy("alice", "admin")
	e.AddPolicy("admin", "/users", "GET")
	e.AddPolicy("admin", "/users/:id", "GET,POST,DELETE")
	e.AddPolicy("admin", "/products", "GET,POST,PUT,DELETE")

	// 4. 检查访问控制
	allowed, _ := e.Enforce("alice", "/users", "GET")
	if allowed {
		println("Access granted")
	} else {
		println("Access denied")
	}
}

以上代码定义了一个名为/users的API端点,它需要管理员权限才能访问。我们使用Casbin的API定义了一个名为admin的角色,并将其分配给Alice用户。我们还定义了一些策略,指定哪些角色有权访问哪些资源。

在运行时,我们可以使用Casbin的API检查Alice是否有权访问/users端点。如果授予了访问权限,则输出"Access granted",否则输出"Access denied"。

这只是一个简单的示例,说明了Casbin如何与Golang一起使用来实现基于角色的访问控制。通过使用Casbin,您可以轻松地定义和管理角色、权限和策略,并在运行时执行访问控制检查。

举报

相关推荐

0 条评论