首页 > 其他分享 >[golang]利用casbin做常规的权限控制

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

时间:2023-05-25 12:00:52浏览次数:43  
标签:definition 定义 角色 casbin 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,您可以轻松地定义和管理角色、权限和策略,并在运行时执行访问控制检查。

标签:definition,定义,角色,casbin,golang,Casbin,权限,访问控制
From: https://blog.51cto.com/u_15747907/6346567

相关文章

  • MySQL Binlog 权限
    Checkbinlogstatus--https://github.com/alibaba/canal/wiki/AdminGuideshowvariableslike'log_bin';showvariableslike'binlog_format';MySQLBinlog权限需要三个权限SELECT,REPLICATIONSLAVE,REPLICATIONCLIENTGRANTSELECT,REPLICATIO......
  • 阿里云如何配置子域名及其对应 RAM 访问权限
    背景背景:假设只有一个二级域名domain.com,有多套环境的情况下,可能需要分配不同的三级子域名sub.domain.com,每个环境可能需要再配置四级子域名sub.sub.domain.com如果使用一个AK拥有所有域名的DNS权限,可能不太安全(即使互相信任,也无法避免误操作导致影响其他环境)需求:......
  • drf之登录功能,认证组件,权限组件,频率组件
    目录一、登录功能表模型视图类回顾路由二、认证组件认证组件使用步骤(固定用法)三、权限组件权限类的使用步骤四、频率组件频率类的使用步骤一、登录功能表模型classUserInfo(models.Model):name=models.CharField(max_length=32)password=models.CharField(max_......
  • django配置文件作用,drf 登录功能,drf认证组件,drf权限组件,drf频率组件
    django配置文件作用:    drf登录功能:view内:from.modelsimportUserInfo,UserTokenfromrest_framework.viewsetsimportViewSetimportuuidfromrest_framework.responseimportResponsefromrest_framework.decoratorsimportactionclassUser......
  • 同步mysql数据库binlog用户所需要权限
    同步mysqlbinlog用户读写权限报错提示doesnothaveREPLICATION_CLENTprivilege 使用场景:常用于阿里云flink同步数据库binlog使用解决方案:fiink cdc 的表用户,需要有Replicationclient,Replicationslave权限。授权命令如下:grantReplicationclienton*.* toods_base@......
  • 权限
    '''权限类使用1写一个类,继承BasePermission2在类中写方法:has_permission1如果有权限,返回Trueifrequest.user.is_super==1:returnTrue2如果没有权限,返回FalsereturnFalse3错误信息是self.message=""self.message=""......
  • 记录--按钮级别权限怎么控制
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助最近的面试中有一个面试官问我按钮级别的权限怎么控制,我说直接v-if啊,他说不够好,我说我们项目中按钮级别的权限控制情况不多,所以v-if就够了,他说不够通用,最后他对我的评价是做过很多东西,但是都不够深入,好吧,那今天我们......
  • 手机投屏音频流转在无系统权限中的应用
    背景在手机投屏处理音频流转问题中介绍了反射android.media.AudioSystem类的setDeviceConnectionState方法来达到音频流转方案,此方案是基于系统权限的,也就是说具有系统签名并且拥有android:sharedUserId="android.uid.system",如果没有这个权限咋整?因公司需要把之前的投屏项目......
  • pb中打开窗体时用户权限检查以及控制工具栏按钮的显示状态
    说明:首先在菜单栏方法中修改对应的name和tag(否则程序无法判断统一判为没权限) im_main=this.MenuID//整体控制工具栏按钮隐藏im_main.of_Set({'m_open','m_printpreview','m_print','m_saveas'},'visible',false)//根据用户权限设置工具栏按钮的显示状态im_mai......
  • 讯飞开放平台机器翻译(新)golang实现demo
    最近做项目用到翻译功能,对接了一下科大讯飞的翻译api接口,demo如下:packagemainimport( "crypto/hmac" "crypto/sha256" "encoding/base64" "encoding/json" "fmt" "io/ioutil" "net/http" "time" "......