目录
- 导语
 - 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"}})
}


	声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
		
评论(0)