每天忙碌的日子,也不要忘记了好好生活 🏠

vuePress-theme-reco happylay 🐑    2020 - 2021
每天忙碌的日子,也不要忘记了好好生活 🏠 每天忙碌的日子,也不要忘记了好好生活 🏠

Choose mode

  • dark
  • auto
  • light
主页
分类
  • 手册
  • 前端
  • 后端
  • 工作
  • 相册
  • 文档
标签
时间轴
文档
  • 轨迹
个人空间
  • 哔哩哔哩
  • 编辑博客
工具集
  • 后端工具

    • 在线json解析
    • yml格式转换
    • websocket测试
    • 时间戳转换
    • cron表达式
    • linux程序包
    • 大小写转换
    • toml格式转换
  • 后端框架

    • Spring
    • GoFrame
  • 前端工具

    • Vant移动端组件库
    • Element桌面端组件库
    • uni-app移动端框架
    • uview移动端框架
    • colorui2.0文档
    • Figma
    • Codepen
    • Dribbble
    • Iconfont阿里矢量图库
    • IconPark图标库
    • Icomoon
    • Remixicon
    • favicon图标制作
  • 开发环境

    • windows包管理器-baulk
    • windows包管理器-scoop
    • windows原版镜像
    • nexus3仓库
  • 微服务

    • 版本兼容关系
    • k8s在线配置
    • k8s接口文档
GitHub
author-avatar

happylay 🐑

34

文章

24

标签

主页
分类
  • 手册
  • 前端
  • 后端
  • 工作
  • 相册
  • 文档
标签
时间轴
文档
  • 轨迹
个人空间
  • 哔哩哔哩
  • 编辑博客
工具集
  • 后端工具

    • 在线json解析
    • yml格式转换
    • websocket测试
    • 时间戳转换
    • cron表达式
    • linux程序包
    • 大小写转换
    • toml格式转换
  • 后端框架

    • Spring
    • GoFrame
  • 前端工具

    • Vant移动端组件库
    • Element桌面端组件库
    • uni-app移动端框架
    • uview移动端框架
    • colorui2.0文档
    • Figma
    • Codepen
    • Dribbble
    • Iconfont阿里矢量图库
    • IconPark图标库
    • Icomoon
    • Remixicon
    • favicon图标制作
  • 开发环境

    • windows包管理器-baulk
    • windows包管理器-scoop
    • windows原版镜像
    • nexus3仓库
  • 微服务

    • 版本兼容关系
    • k8s在线配置
    • k8s接口文档
GitHub
  • 2021

    • casbin实现权限控制
    • dig实现依赖注入
    • ffmpeg视频推流总结
    • gcc编译环境配置
    • goframe常见问题总结
    • goframe框架总结
    • golang工具总结
    • golang语法总结
    • protobuf安装与使用
    • redis实现分布式锁
    • 常用golang库总结

casbin实现权限控制

vuePress-theme-reco happylay 🐑    2020 - 2021

casbin实现权限控制

happylay 🐑 2021-01-18 21:19:12 golang

摘要: casbin实现权限控制 时间: 2021-01-18


# 安装

go get github.com/casbin/casbin/v2
或
require github.com/casbin/casbin/v2 v2.20.1
1
2
3

# 配置文件解读

# rabc_model.conf

# 请求定义
# sub 想要访问资源的用户
# obj 要访问的资源
# act 用户对资源执行的操作,act可以是read、write、print等等你想要自定义的操作
[request_definition]
r = sub, obj, act

# 策略定义,也就是*.cvs文件,p定义的格式
[policy_definition]
p = sub, obj, act

# 组定义,也就是*.cvs文件,g定义的格式。g是用户组或角色
# g表示不同的RBAC体系,_, _表示用户、角色,_, _, _表示用户、角色、域
[role_definition]
g = _, _

# 定义多个策略的结果,allow/deny
# 任意一条策略满足,则最终结果为allow
[policy_effect]
e = some(where (p.eft == allow))

# 定义请求和策略匹配的方式
# p.eft是allow还是deny,基于此来决定
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# rbac_policy.csv

# 策略
p, 张三, A数据, read
p, 李四, B数据, write
p, 超级管理员, B数据, read
p, 超级管理员, B数据, write

# 组
g, 张三, 超级管理员
1
2
3
4
5
6
7
8

# 使用

package gfcasbin

import (
	"fmt"
	"testing"

	"github.com/casbin/casbin/v2"
	"github.com/casbin/casbin/v2/model"
	fileadapter "github.com/casbin/casbin/v2/persist/file-adapter"
	"github.com/gogf/gf/frame/g"
)

// TestCasbin 权限测试
//  文档:
//  https://casbin.org/docs/zh-CN/get-started
//  适配器:
//  https://casbin.org/docs/zh-CN/adapters
//  示例:
//  https://github.com/casbin/casbin/tree/master/examples
func TestCasbin(t *testing.T) {

	rbacModelText :=
		`
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
`
	// enforcer, _ := casbin.NewEnforcer("./config/rbac_model.conf", "./config/rbac_policy.csv")

	// 从字符串中加载模型
	modelFromString, err := model.NewModelFromString(rbacModelText)

	if err != nil {
		fmt.Println(err)
	}
	g.Dump(modelFromString)

	// 从文件中创建一个适配器
	newAdapter := fileadapter.NewAdapter("./config/rbac_policy.csv")

	enforcer, _ := casbin.NewEnforcer(modelFromString, newAdapter)

	// 添加策略
	if ok, _ := enforcer.AddPolicy("admin", "/api/v1/hello", "GET"); !ok {
		fmt.Println("策略已经存在")
	} else {
		fmt.Println("增加成功")
	}

	// 删除策略
	if ok, _ := enforcer.RemovePolicy("admin", "/api/v1/hello", "GET"); !ok {
		fmt.Println("策略不存在")
	} else {
		fmt.Println("删除成功")
	}

	// 获取策略
	list := enforcer.GetPolicy()
	for _, vList := range list {
		fmt.Print("策略:")
		for _, v := range vList {
			fmt.Printf("%s, ", v)
		}
		fmt.Print("\n")
	}

	// 检查权限
	if ok, _ := enforcer.Enforce("李四", "B数据", "write"); ok {
		fmt.Println("权限正常")
	} else {
		fmt.Println("没有权限")
	}

	g.Dump(enforcer.GetAllSubjects())
	g.Dump(enforcer.GetAllRoles())
	g.Dump(enforcer.GetAllObjects())
	g.Dump(enforcer.GetAllActions())

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
编辑文档
最后一次更新: 2021/2/2 下午12:34:17
欢迎来到小屋。
看板娘