结合gin做基本验证
# 结合 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() } } }
1
2
3
4
5
6
7
8
9
10
11
判断登录的这个人是否在
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() } } }
1
2
3
4
5
6
7
8
9
10
11
最后统一使用一个方法来进行返回中间件方法
func Middlewares() (fs []gin.HandlerFunc) {
fs = append(fs, CheckLogin(), RBAC())
return
}
1
2
3
4
2
3
4
主函数
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")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
策略
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
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
没有在请求头放入token
随便放一个token
可以看出,wujie1
并不在上述的sub
里;这里p, member, /depts, GET
策略表示,我们只有GET
请求且是member
角色的,而admin
、wujie
是继承自member
以及lisi
本身可以访问。
同样的,POST
方法可以去测一下。
编辑 (opens new window)
上次更新: 2022/10/29, 21:18:01