Go 每日一库:casbin 库,权限管理的灵活实现

Go 每日一库:casbin 库,权限管理的灵活实现

【免费下载链接】go-daily-lib Go 每日一库 【免费下载链接】go-daily-lib 项目地址: https://gitcode.com/GitHub_Trending/go/go-daily-lib

你是否还在为项目中的权限管理模块头疼?复杂的角色关系、多变的访问规则、不同场景下的权限策略,这些问题往往让开发者耗费大量精力。今天我们要介绍的 casbin 库,将为你提供一套灵活且强大的权限管理解决方案,让你轻松应对各种权限场景。读完本文,你将了解 casbin 的核心概念、基本使用方法以及常见权限模型的实现,帮助你在项目中快速集成权限管理功能。

casbin 库简介

casbin 是一个强大的、高效的开源访问控制框架,它支持多种访问控制模型,如基于角色的访问控制(RBAC)、基于属性的访问控制(ABAC)等。casbin 的核心思想是将访问控制逻辑与业务逻辑分离,通过配置文件来定义权限规则,从而实现权限的灵活管理和动态调整。

casbin 库的主要特点包括:

  • 支持多种访问控制模型,满足不同场景的需求
  • 基于配置文件定义权限规则,便于维护和扩展
  • 提供丰富的 API,易于集成到各种应用中
  • 支持自定义函数,实现复杂的权限判断逻辑

在本项目中,casbin 相关的代码和示例可以在 casbin/ 目录下找到。

快速开始

让我们从一个简单的示例开始,了解 casbin 的基本使用方法。

环境准备

首先,需要确保你的项目中已经引入了 casbin 库。你可以通过以下命令安装:

go get github.com/casbin/casbin/v2

基本示例

casbin/get-started/ 目录下,我们提供了一个 casbin 的快速入门示例。

首先,我们需要定义一个模型配置文件 model.conf

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

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

这个模型定义了请求(request)、策略(policy)、匹配器(matchers)和策略效果(policy effect)四个部分。

然后,我们需要定义一个策略文件 policy.csv

p, dajun, data1, read
p, lizi, data2, write

这个策略文件定义了两条权限规则:用户 dajun 可以读取 data1,用户 lizi 可以写入 data2。

最后,我们编写代码 main.go 来使用 casbin 进行权限检查:

package main

import (
	"fmt"
	"log"

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

func check(e *casbin.Enforcer, sub, obj, act string) {
	ok, _ := e.Enforce(sub, obj, act)
	if ok {
		fmt.Printf("%s CAN %s %s\n", sub, act, obj)
	} else {
		fmt.Printf("%s CANNOT %s %s\n", sub, act, obj)
	}
}

func main() {
	e, err := casbin.NewEnforcer("./model.conf", "./policy.csv")
	if err != nil {
		log.Fatalf("NewEnforecer failed:%v\n", err)
	}

	check(e, "dajun", "data1", "read")
	check(e, "lizi", "data2", "write")
	check(e, "dajun", "data1", "write")
	check(e, "dajun", "data2", "read")
}

运行这段代码,输出结果如下:

dajun CAN read data1
lizi CAN write data2
dajun CANNOT write data1
dajun CANNOT read data2

从输出结果可以看出,casbin 正确地执行了我们定义的权限规则。

常见权限模型

casbin 支持多种常见的权限模型,下面我们将介绍几种主要的模型及其实现。

RBAC 模型

基于角色的访问控制(RBAC)是一种常见的权限管理模型,它将权限分配给角色,用户通过拥有角色来获得相应的权限。

casbin/rbac/ 目录下,我们提供了 RBAC 模型的多个示例,包括基本 RBAC、RBAC 层级结构、RBAC 域等。

基本 RBAC

基本 RBAC 模型的示例代码可以在 casbin/rbac/base/ 目录下找到。

模型配置文件 model.conf 定义了角色和权限的关系:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act
g = _, _

[role_definition]
g = _, _

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

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

策略文件 policy.csv 定义了用户、角色和权限的关系:

p, admin, data, read
p, admin, data, write
p, user, data, read
g, dajun, admin
g, lizi, user

在这个示例中,admin 角色拥有 data 的读写权限,user 角色拥有 data 的读权限。dajun 是 admin 角色,lizi 是 user 角色。

RBAC 层级结构

RBAC 层级结构允许角色之间存在继承关系,子角色可以继承父角色的权限。示例代码可以在 casbin/rbac/hierarchy/ 目录下找到。

ABAC 模型

基于属性的访问控制(ABAC)是一种更加灵活的权限模型,它根据主体、客体的属性以及环境信息来判断权限。

casbin/abac/ 目录下,我们提供了 ABAC 模型的示例。

模型配置文件 model.conf 定义了基于属性的匹配规则:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[matchers]
m = r.sub.Owner == r.obj.Name || r.sub.Hour >= 9 && r.sub.Hour <= 18

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

在这个示例中,我们定义了两个匹配条件:要么主体是客体的所有者,要么访问时间在 9 点到 18 点之间。

示例代码 main.go 演示了如何使用 ABAC 模型进行权限检查:

package main

import (
	"fmt"
	"log"

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

type Object struct {
	Name  string
	Owner string
}

type Subject struct {
	Name string
	Hour int
}

func check(e *casbin.Enforcer, sub Subject, obj Object, act string) {
	ok, _ := e.Enforce(sub, obj, act)
	if ok {
		fmt.Printf("%s CAN %s %s at %d:00\n", sub.Name, act, obj.Name, sub.Hour)
	} else {
		fmt.Printf("%s CANNOT %s %s at %d:00\n", sub.Name, act, obj.Name, sub.Hour)
	}
}

func main() {
	e, err := casbin.NewEnforcer("./model.conf", "./policy.csv")
	if err != nil {
		log.Fatalf("NewEnforecer failed:%v\n", err)
	}

	o := Object{"data", "dajun"}
	s1 := Subject{"dajun", 10}
	check(e, s1, o, "read")

	s2 := Subject{"lizi", 10}
	check(e, s2, o, "read")

	s3 := Subject{"dajun", 20}
	check(e, s3, o, "read")

	s4 := Subject{"lizi", 20}
	check(e, s4, o, "read")
}

自定义函数

casbin 允许我们定义自定义函数,以实现更复杂的权限判断逻辑。在 casbin/function/ 目录下,我们提供了自定义函数的示例。

内置函数

casbin 已经内置了一些常用的函数,例如 keyMatchipMatch 等。示例代码可以在 casbin/function/built-in/ 目录下找到。

自定义函数

我们也可以定义自己的函数来扩展 casbin 的功能。示例代码可以在 casbin/function/self-defined/ 目录下找到。

在这个示例中,我们定义了一个自定义函数 isEven,用于判断用户 ID 是否为偶数:

func isEven(args ...interface{}) (interface{}, error) {
	id := args[0].(int)
	return id%2 == 0, nil
}

然后在模型配置文件中使用这个函数:

[matchers]
m = isEven(r.sub)

总结

casbin 是一个功能强大、灵活易用的权限管理库,它支持多种访问控制模型,能够满足不同场景下的权限管理需求。通过本文的介绍,我们了解了 casbin 的基本概念、快速入门方法以及常见权限模型的实现。

在实际项目中,你可以根据自己的需求选择合适的权限模型,并通过自定义函数等方式扩展 casbin 的功能。希望 casbin 能够帮助你更好地管理项目中的权限问题。

如果你对 casbin 还有更多的疑问或者想要深入学习,可以参考 casbin 的官方文档,或者查看本项目中 casbin/ 目录下的更多示例代码。

最后,如果你觉得本文对你有帮助,欢迎点赞、收藏、关注,我们下期再见!

【免费下载链接】go-daily-lib Go 每日一库 【免费下载链接】go-daily-lib 项目地址: https://gitcode.com/GitHub_Trending/go/go-daily-lib

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值