Casbin鉴权步骤
演示代码以 golang gin gorm 为例
先给大家展示一下项目框架
大家可以对照一下,方便后续上手
第零步:安装Casbin
go get github.com/casbin/gorm-adapter/v3
第一步:编写权限管理模型
app/casbin/model.config
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act, eft
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
[matchers]
m = g(r.sub, p.sub) && keyMatch(r.act, p.act) && keyMatch(r.obj, p.obj)
这里使用的是RBAC模型,大家可以根据需求自行更改
第二步:加载数据库中的权限列表
app/casbin/casbin.go
var Casbin *casbin.Enforcer
func InitCasbin() error {
// 注意!!!
// 此处的数据库链接信息需要改成自己的
str := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
a, err := gormadapter.NewAdapter("mysql", str, true)
e, err := casbin.NewEnforcer("app/casbin/model.conf", a)
if err != nil {
panic(err)
}
Casbin = e
err = Casbin.LoadPolicy()
if err != nil {
return err
}
return nil
}
一定注意,要把数据库链接信息改成自己的,要不然会报错的哦~
数据库中要先创建一个名为casbin的数据库~
第三步:创建中间件
pkg/middlewares/authMiddleware.go
func CasbinAuth(e *casbin.Enforcer) gin.HandlerFunc {
return func(c *gin.Context) {
//path := c.Request.URL.Path
obj := c.Request.URL.RequestURI()
//获取请求方法
act := c.Request.Method
//获取用户的角色 —— 这一步需要根据实际情况更改
authHeader := c.Request.Header.Get("Authorization")
parts := strings.SplitN(authHeader, " ", 2)
token := strings.TrimSpace(parts[1])
// 校验 token
mc, _ := jwt.ValidateToken(token)
//判断策略中是否存在
sub := mc.Nickname
if ok, _ := e.Enforce(sub, obj, act); ok {
fmt.Println("恭喜您,权限验证通过")
c.Next()
} else {
fmt.Println("很遗憾,权限验证没有通过")
resp.ResponseErrorWithMsg(c, resp.CodeInvalidAuthFormat, "没有权限呢,杂鱼杂鱼~")
c.Abort()
}
}
}
注意:
这里用户信息是解析token得来的,这里需要根据你项目的实际情况进行更改,目的是获取到用户名
第四步:进行鉴权
app/manager/router/manager.go (项目中只有这个需要鉴权,大家根据需要添加即可)
func RegisterManagerRoutes(r *gin.Engine) {
useMiddleWare := r.Group("/api/v1/manager").Use(middlewares.CasbinAuth(casbin.Casbin))
{
// 添加需要过滤的内容 ,如下
useMiddleWare.POST("/add", apis.Insert)
}
}
第五步:在项目启动时加载鉴权模块
main.go
func main() {
if err := casbin.InitCasbin(); err != nil {
fmt.Printf("init casbin failed, err:%v\n", err)
return
}
}
第六步: 添加权限列表
操作完以上步骤之后可以先运行一下,数据库中就会多出一个 casbin_rule 表
之后往表中添加所需权限即可