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 中,策略和角色/资源继承关系可以通过以下方式在数据库中维护:
策略表结构
你可以创建两张表来维护策略和角色/资源的继承关系。
权限策略表
| id | ptype | subject | object | action | effect |
|---|---|---|---|---|---|
| 1 | p | ROLE_ROOT | SystemMenu | read | allow |
| 2 | p | ROLE_ROOT | AdminMenu | read | allow |
| 3 | p | ROLE_ROOT | UserMenu | read | deny |
| 4 | p | ROLE_ADMIN | UserMenu | read | allow |
| 5 | p | ROLE_ADMIN | AdminMenu | read | allow |
| 6 | p | ROLE_ADMIN | AdminSubMenu_deny | read | deny |
| 7 | p | ROLE_USER | UserSubMenu_allow | read | allow |
角色继承表
| id | ptype | user | role |
|---|---|---|---|
| 1 | g | user | ROLE_USER |
| 2 | g | admin | ROLE_ADMIN |
| 3 | g | root | ROLE_ROOT |
| 4 | g | ROLE_ADMIN | ROLE_USER |
资源继承表
| id | ptype | sub_resource | resource |
|---|---|---|---|
| 1 | g2 | UserSubMenu_allow | UserMenu |
| 2 | g2 | UserSubMenu_deny | UserMenu |
| 3 | g2 | UserSubSubMenu | UserSubMenu_allow |
| 4 | g2 | AdminSubMenu_allow | AdminMenu |
| 5 | g2 | AdminSubMenu_deny | AdminMenu |
| 6 | g2 | (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 | 类型 | 角色 | 资源 | 操作 | 结果 |
|---|---|---|---|---|---|
| 1 | p | ROLE_ROOT | SystemMenu | read | allow |
| 2 | p | ROLE_ROOT | AdminMenu | read | allow |
| 3 | p | ROLE_ROOT | UserMenu | read | deny |
| 4 | p | ROLE_ADMIN | UserMenu | read | allow |
| 5 | p | ROLE_ADMIN | AdminMenu | read | allow |
| 6 | p | ROLE_ADMIN | AdminSubMenu_deny | read | deny |
| 7 | p | ROLE_USER | UserSubMenu_allow | read | allow |
角色继承表
这个表定义了用户和角色之间的关系。
| id | 类型 | 用户 | 角色 |
|---|---|---|---|
| 1 | g | user | ROLE_USER |
| 2 | g | admin | ROLE_ADMIN |
| 3 | g | root | ROLE_ROOT |
| 4 | g | ROLE_ADMIN | ROLE_USER |
资源继承表
这个表定义了资源之间的继承关系。
| id | 类型 | 子资源 | 资源 |
|---|---|---|---|
| 1 | g2 | UserSubMenu_allow | UserMenu |
| 2 | g2 | UserSubMenu_deny | UserMenu |
| 3 | g2 | UserSubSubMenu | UserSubMenu_allow |
| 4 | g2 | AdminSubMenu_allow | AdminMenu |
| 5 | g2 | AdminSubMenu_deny | AdminMenu |
| 6 | g2 | (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 表示资源继承。
通过这种方式,你可以灵活地管理谁可以访问哪些资源。