go语言beego+casbin rbac权限控制使用示例代码
这是我的线上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{})
}
效果:
相关文章