GoFrame 框架使用 casbin 权限认证

说明

  • 框架使用 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 协议》,转载必须注明作者和本文链接
994914376
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!