GoFrame 框架使用 casbin 許可權認證

994914376發表於2020-01-14

說明

  • 框架使用 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了 完整程式碼

GoFrame框架使用casbin許可權認證

GoFrame框架使用casbin許可權認證

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章