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了 完整代码
本作品采用《CC 协议》,转载必须注明作者和本文链接
有结合数据库生成 配置文件吗