說明
-
框架使用 GoFrame 國產框架 強哥 開發
-
jwt 使用 https://github.com/gogf/gf-jwt 鵬哥編寫的
-
許可權使用 casbin 外掛 地址、
-
使用說明
-
官網的 gf-demos 已經包含了基本的示例操作,但是現在都屬於前後端分離開發模式,特對使用者資訊無
狀態儲存做了一翻更改,使用 jwt 生成的 token 來做使用者狀態識別,接下來進入正題
使用說明
基於上一篇使用
jwt
認證形式完成授權,本章接著上一章來實現使用者登入成功如果判斷是否有許可權訪問,許可權使用casbin
包來實現使用者關聯角色
角色關聯選單
許可權關係為:
角色(role.name,menu.path,menu.method)
使用者(user.username,role.name)
準備工作 建立sql
// 使用者表
CREATE TABLE `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`uuid` varchar(32) DEFAULT NULL COMMENT 'UUID',
`username` varchar(32) NOT NULL COMMENT '登入名/11111',
`password` varchar(32) NOT NULL COMMENT '密碼',
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='使用者表'
// 使用者角色關聯表
CREATE TABLE `user_role` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned DEFAULT NULL COMMENT '使用者ID',
`role_id` int(11) unsigned DEFAULT NULL COMMENT '角色ID',
`deleted_on` int(11) unsigned DEFAULT '0' COMMENT '刪除時間戳',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='使用者_角色ID_管理'
// 角色表
CREATE TABLE `role` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT '' COMMENT '名字',
`created_on` int(11) unsigned DEFAULT NULL COMMENT '建立時間',
`modified_on` int(11) unsigned DEFAULT NULL COMMENT '更新時間',
`deleted_on` int(11) unsigned DEFAULT '0' COMMENT '刪除時間戳',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='角色'
// 角色選單關聯表
CREATE TABLE `role_menu` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`role_id` int(11) unsigned DEFAULT NULL COMMENT '角色ID',
`menu_id` int(11) unsigned DEFAULT NULL COMMENT '選單ID',
`deleted_on` int(11) unsigned DEFAULT '0' COMMENT '刪除時間戳',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='使用者_角色ID_管理'
// 選單表
CREATE TABLE `menu` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT '' COMMENT '名字',
`type` enum('選單','按鈕','目錄') DEFAULT '選單',
`path` varchar(50) DEFAULT '' COMMENT '訪問路徑',
`method` varchar(50) DEFAULT '' COMMENT '資源請求方式',
`created_on` int(11) unsigned DEFAULT NULL COMMENT '建立時間',
`modified_on` int(11) unsigned DEFAULT NULL COMMENT '更新時間',
`deleted_on` int(11) unsigned DEFAULT '0' COMMENT '刪除時間戳',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
我們先來測試檔案許可權如何實現
1、我們先建立一個檔案,通過定義兩個配置檔案來實現許可權控制,但這樣每次更改許可權都得手動更改一次檔案,非常不方便,接下來會把策略資訊放到資料庫中來實現
func TestRBAC(r *ghttp.Request) {
e, _ := casbin.NewEnforcer("config/rbac/rbac.conf", "config/rbac/rbac.csv")
fmt.Printf("RBAC test start\n")
// 註冊
sub := "alice" // 使用者
obj := "data1" // 訪問地址
act := "read" // 訪問資源
ok, err := e.Enforce(sub, obj, act)
if err != nil {
// handle err
}
if ok == true {
fmt.Println("找到資料了")
} else {
fmt.Println("沒有找到")
}
}
config/rbac/rbac.conf
檔案內容
[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
# config/rbac/rbac.csv檔案內容
p, alice, data1, read
p, bob, data2, write
p, data2_admin, data2, read
p, data2_admin, data2, write
g, alice, data2_admin
配置檔案解釋 官網有詳細的解釋說明 官網地址
接下來進入實戰階段
1、初始化 casbin
許可權配置
// 此處的策略我們傳的是一個false 在後續通過程式碼來動態新增
enforcer, err := casbin.NewEnforcer("config/rbac/rbac.conf", false)
if err != nil {
fmt.Println("匯入錯誤")
}
_, _ = enforcer.AddRoleForUser("admin", "業務主管")
_, _ = enforcer.AddPermissionForUser("業務主管", "/test", "POST")
2、通過中介軟體檢測許可權資訊
ok, err := enforcer.Enforce(sub, obj, act)
g.Dump(ok)
if err != nil {
// handle err
}
if ok == true {
fmt.Println("找到資料了")
} else {
fmt.Println("沒有找到")
r.Exit()
}
3、建立路由資訊進行訪問測試
group.GET("/test", func(r *ghttp.Request) {
r.Response.Write("我是來測試")
})
通過以上的步驟就完成了casbin許可權認證檢測 完整的程式碼我上傳到github了 完整程式碼
本作品採用《CC 協議》,轉載必須註明作者和本文連結