go语言beego+casbin rbac权限控制使用示例代码

2023-06-01 语言 示例 权限

这是我的线上beego项目后台打算加个rbac权限控制,先行测试一下,记录起来

casbin官方手册文档:

https://casbin.org/docs/zh-CN/get-started

废话不多说直接进入步骤

(环境啥的就不介绍了,我这beego项目之前的文章有写,有兴趣的可以自行翻阅)


安装casbin / beego-orm-adapter

D:\goblog>go get github.com/casbin/casbin/v2
go: downloading github.com/casbin/casbin/v2 v2.44.2
go: github.com/casbin/casbin/v2 upgrade => v2.44.2
go: downloading github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739
+incompatible
D:\goblog>go get github.com/casbin/beego-orm-adapter/v3
...

ps:如果遇到404错误 比如下面提示。 就自己重复执行几次,这就不多说了

go get github.com/casbin/casbin/v2: module github.com/casbin/casbin/v2: reading
https://mirrors.aliyun.com/goproxy/github.com/casbin/casbin/v2/@v/list: 404 Not
Found

数据库表(如果没有运行的时候会提醒你的)

我这三表:

admin  、  role  、 casbin_rule


rbac_model.conf把这个文件复制出来放进项目里,可以直接去官方手册复制

也可以在你刚安装casbin包示例代码文件夹里:

\pkg\mod\github.com\casbin\beego-orm-adapter\[email protected]\examples\rbac_model.conf

比如:

\conf\rbac_model.conf


下面是测试demo,其他知识请自行上官方文档查阅

后台拦截器中间件

package middleware

import (
"fmt"
"strings"
"test/models"

"github.com/astaxie/beego"
"github.com/astaxie/beego/context"
beegoormadapter "github.com/casbin/beego-orm-adapter/v3"
"github.com/casbin/casbin/v2"
_ "github.com/go-sql-driver/mysql"
)

// 中间件
func Auth() {
//admin请求前拦截器
a, _ := beegoormadapter.NewAdapter("default", "mysql", "root:Cbb_0721!@#[email protected](192.168.1.140:3306)/beego")
e, _ := casbin.NewEnforcer("conf/rbac_model.conf", a)

beego.InsertFilter("/ad/*", beego.BeforeRouter, Authorizer(e))
}

func Authorizer(e *casbin.Enforcer) beego.FilterFunc {
return func(ctx *context.Context) {
// 获取用户角色
admins, ok := ctx.Input.Session("admins").(models.Admin)
//检查是否登录
if !ok && ctx.Request.RequestURI != "/ad/login" {
ctx.Redirect(302, "/ad/login")
}
user := admins.Username

// 获取访问路径
method := strings.ToLower(ctx.Request.Method)
// 获取访问方式
path := strings.ToLower(ctx.Request.URL.Path)
fmt.Println(user, path, method, "权限参数打印")

// sub := "test"      // 想要访问资源的用户/角色。
// obj := "get"       // 将被访问的资源/用户/角色。
// act := "/ad/test1" // 用户对资源执行的操作。

//ps: 继承关系-前面继承后面 -- 角色继承用户/角色继承角色
roles, err := e.GetRolesForUser(user)
fmt.Println(roles, err, "用户是什么角色")

if ok, _ := e.Enforce(user, path, method); ok {
fmt.Println("恭喜您,权限验证通过")
} else {
if path != "/ad/login" {
ctx.Output.JSON(map[string]string{"msg": "用户权限不足"}, true, false)
}
fmt.Println("很遗憾,权限验证没有通过")
}

}
}


路由:

package routers

import (
"test/controllers"
"test/middleware"

"github.com/astaxie/beego"
)

func init() {
beego.Router("/", &controllers.MainController{})

middleware.Auth()

//后台管理路由
//使用注解路由
beego.Include(&controllers.AdminController{})
}

效果:

casbin_rule.png

casbin.png

相关文章