Golang利用casbin实现权限验证详解
作者:爷来辣
Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型,Casbin只负责访问控制。本文将利用casbin实现权限验证功能,需要的可以参考一下
导语
学习一下golang权限控制,保留一下demo代码作为参考
Casbin是什么
Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型,Casbin只负责访问控制。
其功能有:
- 支持自定义请求的格式,默认的请求格式为
{subject, object, action}
。 - 具有访问控制模型model和策略policy两个核心概念。
- 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
- 支持内置的超级用户 例如:
root
或administrator
。超级用户可以执行任何操作而无需显式的权限声明。 - 支持多种内置的操作符,如
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权限验证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!