结合gin做基本验证
主要编写2个中间件
简单判断是否登录,使用请求头里判断是否有
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()
}
}
}
判断登录的这个人是否在
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
角色的,而admin
、wujie
是继承自member
以及lisi
本身可以访问。
同样的,POST
方法可以去测一下。