Skip to main content

go casbin

数据展示

p, ROLE_ROOT, SystemMenu, read, allow
p, ROLE_ROOT, AdminMenu, read, allow
p, ROLE_ROOT, UserMenu, read, deny
p, ROLE_ADMIN, UserMenu, read, allow
p, ROLE_ADMIN, AdminMenu, read, allow
p, ROLE_ADMIN, AdminSubMenu_deny, read, deny
p, ROLE_USER, UserSubMenu_allow, read, allow

g, user, ROLE_USER
g, admin, ROLE_ADMIN
g, root, ROLE_ROOT
g, ROLE_ADMIN, ROLE_USER

g2, UserSubMenu_allow, UserMenu
g2, UserSubMenu_deny, UserMenu
g2, UserSubSubMenu, UserSubMenu_allow
g2, AdminSubMenu_allow, AdminMenu
g2, AdminSubMenu_deny, AdminMenu
g2, (NULL), SystemMenu

数据库展示

在 Casbin 中,策略和角色/资源继承关系可以通过以下方式在数据库中维护:

策略表结构

你可以创建两张表来维护策略和角色/资源的继承关系。

权限策略表

idptypesubjectobjectactioneffect
1pROLE_ROOTSystemMenureadallow
2pROLE_ROOTAdminMenureadallow
3pROLE_ROOTUserMenureaddeny
4pROLE_ADMINUserMenureadallow
5pROLE_ADMINAdminMenureadallow
6pROLE_ADMINAdminSubMenu_denyreaddeny
7pROLE_USERUserSubMenu_allowreadallow

角色继承表

idptypeuserrole
1guserROLE_USER
2gadminROLE_ADMIN
3grootROLE_ROOT
4gROLE_ADMINROLE_USER

资源继承表

idptypesub_resourceresource
1g2UserSubMenu_allowUserMenu
2g2UserSubMenu_denyUserMenu
3g2UserSubSubMenuUserSubMenu_allow
4g2AdminSubMenu_allowAdminMenu
5g2AdminSubMenu_denyAdminMenu
6g2(NULL)SystemMenu

解释

  • 策略表 (p):定义具体的访问控制策略,包含角色、资源、操作及其效果(允许或拒绝)。
  • 角色继承表 (g):定义用户与角色的关系,支持角色的层级继承。
  • 资源继承表 (g2):定义资源之间的继承关系,支持资源的层级结构。

使用 Casbin 加载策略

Casbin 会从数据库中加载这些策略和关系,用于权限验证。例如:

import (
"github.com/casbin/casbin/v2"
"github.com/casbin/xorm-adapter/v2"
)

func main() {
// 初始化 MySQL 适配器
a, _ := xormadapter.NewAdapter("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")

// 创建 Enforcer 并使用数据库适配器
e, _ := casbin.NewEnforcer("path/to/model.conf", a)

// 加载策略
e.LoadPolicy()

// 检查权限
hasAccess, _ := e.Enforce("user", "UserMenu", "read")

if hasAccess {
fmt.Println("Access granted")
} else {
fmt.Println("Access denied")
}
}

通过这种方式,你可以动态管理和检查权限策略。

什么意思

我来简化一下解释。

1. 策略和角色/资源继承

在 Casbin 中,你定义了谁可以对什么资源执行什么操作。你还可以定义角色和资源的继承关系。

2. 数据库表结构

权限策略表

这个表定义了角色对资源的访问权限。

id类型角色资源操作结果
1pROLE_ROOTSystemMenureadallow
2pROLE_ROOTAdminMenureadallow
3pROLE_ROOTUserMenureaddeny
4pROLE_ADMINUserMenureadallow
5pROLE_ADMINAdminMenureadallow
6pROLE_ADMINAdminSubMenu_denyreaddeny
7pROLE_USERUserSubMenu_allowreadallow

角色继承表

这个表定义了用户和角色之间的关系。

id类型用户角色
1guserROLE_USER
2gadminROLE_ADMIN
3grootROLE_ROOT
4gROLE_ADMINROLE_USER

资源继承表

这个表定义了资源之间的继承关系。

id类型子资源资源
1g2UserSubMenu_allowUserMenu
2g2UserSubMenu_denyUserMenu
3g2UserSubSubMenuUserSubMenu_allow
4g2AdminSubMenu_allowAdminMenu
5g2AdminSubMenu_denyAdminMenu
6g2(NULL)SystemMenu

3. 使用 Casbin 检查权限

Casbin 会从数据库中加载这些策略和继承关系,然后你可以用它来检查某个用户是否有权访问某个资源。

示例代码

import (
"github.com/casbin/casbin/v2"
"github.com/casbin/xorm-adapter/v2"
)

func main() {
// 初始化 MySQL 适配器
a, _ := xormadapter.NewAdapter("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")

// 创建 Enforcer 并使用数据库适配器
e, _ := casbin.NewEnforcer("path/to/model.conf", a)

// 加载策略
e.LoadPolicy()

// 检查权限
hasAccess, _ := e.Enforce("user", "UserMenu", "read")

if hasAccess {
fmt.Println("Access granted")
} else {
fmt.Println("Access denied")
}
}

解释

  • p 表示权限策略。
  • g 表示角色继承。
  • g2 表示资源继承。

通过这种方式,你可以灵活地管理谁可以访问哪些资源。

https://casbin.org/zh/docs/policy-storage