Golang利用casbin实现权限验证详解

 更新时间:2023年02月03日 15:00:59   作者:爷来辣  
Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型,Casbin只负责访问控制。本文将利用casbin实现权限验证功能,需要的可以参考一下

导语

学习一下golang权限控制,保留一下demo代码作为参考

Casbin是什么

Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型,Casbin只负责访问控制。

其功能有:

  • 支持自定义请求的格式,默认的请求格式为{subject, object, action}
  • 具有访问控制模型model和策略policy两个核心概念。
  • 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
  • 支持内置的超级用户 例如:rootadministrator。超级用户可以执行任何操作而无需显式的权限声明。
  • 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*

实现思路

package main

import (
	"fmt"
	"github.com/casbin/casbin/v2"
	gormadapter "github.com/casbin/gorm-adapter/v3"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	//e, err := casbin.NewEnforcer("model.conf", "policy.csv")  // 本地policy

	a, _ := gormadapter.NewAdapter("mysql", "root:pass@tcp(localhost:3306)/casbin?charset=utf8mb4&parseTime=True&loc=Local", true) // 数据库policy
	e, _ := casbin.NewEnforcer("./model.conf", a)                                                                                            // model依旧放本地 没有必要放数据库 把a变成了适配器存到了数据库

	// Load the policy from DB.
	e.LoadPolicy()

	// Check the permission.
	e.Enforce("alice", "data1", "read")

	// Modify the policy.
	// e.AddPolicy(...)
	// e.RemovePolicy(...)

	// Save the policy back to DB.
	e.SavePolicy()
	sub := "alice" // 想要访问资源的用户
	obj := "data1" // 将要被访问的资源
	act := "read"  // 用户对资源实施的操作
	//added, err := e.AddPolicy("alice", "data1", "read") // added返回是bool类型
	//fmt.Println(added)
	//fmt.Println(err)
	//if err != nil {
	//	// 处理错误
	//	fmt.Printf("%s", err)
	//}
	ok, err := e.Enforce(sub, obj, act)

	if err != nil {
		// 处理错误
		fmt.Printf("%s", err)
	}

	if ok == true {
		// 允许 alice 读取 data1
		fmt.Println("通过")
	} else {
		// 拒绝请求,抛出异常
		fmt.Println("未通过")
	}

	// 您可以使用 BatchEnforce() 去批量处理一些请求。
	// 这个方法返回一个布尔类型的切片,切片的下标对应二位数组的行标
	// 例如 results[0] 是 {"alice", "data1", "read"} 的结果
	//results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})
}

package main

import (
	"fmt"
	"github.com/casbin/casbin/v2"
	gormadapter "github.com/casbin/gorm-adapter/v3"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	//e, err := casbin.NewEnforcer("model.conf", "policy.csv")  // 本地policy

	a, _ := gormadapter.NewAdapter("mysql", "root:pass@tcp(localhost:3306)/casbin?charset=utf8mb4&parseTime=True&loc=Local", true) // 数据库policy
	e, _ := casbin.NewEnforcer("./model.conf", a)                                                                                            // model依旧放本地 没有必要放数据库 把a变成了适配器存到了数据库

	// Load the policy from DB.
	e.LoadPolicy()

	// Check the permission.
	e.Enforce("alice", "data1", "read")

	// Modify the policy.
	// e.AddPolicy(...)
	// e.RemovePolicy(...)

	// Save the policy back to DB.
	e.SavePolicy()
	sub := "alice" // 想要访问资源的用户
	obj := "data1" // 将要被访问的资源
	act := "read"  // 用户对资源实施的操作
	added, err := e.AddPolicy("alice", "data1", "read") // added返回是bool类型
	fmt.Println(added)

	if err != nil {
		// 处理错误
		fmt.Printf("%s", err)
	}
	ok, err := e.Enforce(sub, obj, act)

	if err != nil {
		// 处理错误
		fmt.Printf("%s", err)
	}

	if ok == true {
		// 允许 alice 读取 data1
		fmt.Println("通过")
	} else {
		// 拒绝请求,抛出异常
		fmt.Println("未通过")
	}

	// 您可以使用 BatchEnforce() 去批量处理一些请求。
	// 这个方法返回一个布尔类型的切片,切片的下标对应二位数组的行标
	// 例如 results[0] 是 {"alice", "data1", "read"} 的结果
	//results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})
}

到此这篇关于Golang利用casbin实现权限验证详解的文章就介绍到这了,更多相关Golang casbin权限验证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go依赖注入DI工具wire使用详解(golang常用库包)

    Go依赖注入DI工具wire使用详解(golang常用库包)

    依赖注入是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入,本文结合示例代码给大家介绍Go依赖注入DI工具wire使用,感兴趣的朋友一起看看吧
    2022-04-04
  • go语言中GOPATH GOROOT的作用和设置方式

    go语言中GOPATH GOROOT的作用和设置方式

    这篇文章主要介绍了go语言中GOPATH GOROOT的作用和设置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go语言中结构体的高级技巧分享

    Go语言中结构体的高级技巧分享

    这篇文章主要为大家分享一下Go语言中结构体的高级技巧,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-08-08
  • golang使用excelize库操作excel文件的方法详解

    golang使用excelize库操作excel文件的方法详解

    Excelize是Go语言编写的用于操作Office Excel文档基础库,基于ECMA-376,ISO/IEC 29500国际标准,下面这篇文章主要给大家介绍了关于golang使用excelize库操作excel文件的相关资料,需要的朋友可以参考下
    2022-11-11
  • Go语言实现二分查找方法示例

    Go语言实现二分查找方法示例

    这篇文章主要为大家介绍了Go语言实现二分查找方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • go语言处理JSON和XML数据示例解析

    go语言处理JSON和XML数据示例解析

    这篇文章主要介绍了go语言处理JSON和XML数据的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • go-zero自定义中间件的几种方式

    go-zero自定义中间件的几种方式

    首先 go-zero 已经为我们提供了很多的中间件的实现,但有时难免有需求需要自定义,这里介绍几种自定义的方法,文中通过代码示例讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-07-07
  • Golang线上内存爆掉问题排查(pprof)与解决

    Golang线上内存爆掉问题排查(pprof)与解决

    这篇文章主要介绍了Golang线上内存爆掉问题排查(pprof)与解决,涉及到数据敏感,文中代码是我模拟线上故障的一个情况,好在我们程序都有添加pprof监控,于是直接通过go tool pprof分析,需要的朋友可以参考下
    2024-04-04
  • Go语言并发之context标准库的使用详解

    Go语言并发之context标准库的使用详解

    Context的出现是为了解决在大型应用程序中的并发环境下,协调和管理多个goroutine之间的通信、超时和取消操作的问题,本文就来和大家简单聊聊它的具体用法,希望对大家有所帮助
    2023-06-06
  • Golang实现按行读取文件的方法小结

    Golang实现按行读取文件的方法小结

    按行读取文件相较于一次性载入,有着很多优势,如内存效率高、处理速度快、实时性高等,本文主要介绍了Golang按行读取文件的相关方法,希望对大家有所帮助
    2024-02-02

最新评论