跳到主要内容

结合gin做基本验证

主要编写2个中间件

  1. 简单判断是否登录,使用请求头里判断是否有token

    // CheckLogin 简单判断是否有 token 判断是否登录
    func CheckLogin() gin.HandlerFunc {
    return func(ctx *gin.Context) {
    if ctx.Request.Header.Get("token") == "" {
    ctx.AbortWithStatusJSON(400, gin.H{"message": "token required"})
    } else {
    ctx.Set("user_name", ctx.Request.Header.Get("token"))
    ctx.Next()
    }
    }
    }
  1. 判断登录的这个人是否在casbin的决策里,是否有该请求的方法和请求方法是否有权限

    func RBAC() gin.HandlerFunc {
    e := casbin.NewEnforcer("resources/model.conf", "resources/p.csv")
    return func(ctx *gin.Context) {
    user, _ := ctx.Get("user_name")
    if !e.Enforce(user, ctx.Request.RequestURI, ctx.Request.Method) {
    ctx.AbortWithStatusJSON(403, gin.H{"message": "forbidden"})
    } else {
    ctx.Next()
    }
    }
    }

最后统一使用一个方法来进行返回中间件方法

func Middlewares() (fs []gin.HandlerFunc) {
fs = append(fs, CheckLogin(), RBAC())
return
}

主函数

package main

import (
"gcasbin/lib"
"github.com/gin-gonic/gin"
)

func main() {
r := gin.New()
r.Use(lib.Middlewares()...)

r.GET("/depts", func(ctx *gin.Context) {
ctx.JSON(200, gin.H{"result": "部门列表"})
})

r.POST("/depts", func(c *gin.Context) {
c.JSON(200, gin.H{"result": "批量修改部门列表"})
})

r.Run(":8080")
}

策略

p, member, /depts, GET
p, member, /depts/:id, GET

p, admin, /depts, POST
p, admin, /depts/:id, PUT
p, admin, /depts/:id, DELETE

g, admin, member
g, wujie, admin
g, lisi, member

没有在请求头放入token

请求测试

随便放一个token

可以看出,wujie1并不在上述的sub里;这里p, member, /depts, GET策略表示,我们只有GET请求且是member角色的,而adminwujie是继承自member以及lisi本身可以访问。

同样的,POST方法可以去测一下。