Golang利用casbin实现权限验证详解
爷来辣 人气:0导语
学习一下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"}}) }
加载全部内容