目录
1 介绍
Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点
对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错
借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范.
2 练习
本次练习主要对上一次的代码继续进行改善,
增加了一个鉴权中间件,用户可以通过注册时获得的TOKEN,
直接访问后续服务,本次任务首先,增加一个鉴权中间件环节。
具体实现代码如下,
AuthMidddleware.go
package middleware
import (
"GINVUE/Model"
"GINVUE/common"
"net/http"
"strings"
"github.com/gin-gonic/gin"
)
func AuthMiddleware() gin.HandlerFunc {
return func(ctx *gin.Context) {
//获取authorization header
tokenString := ctx.GetHeader("Authorization")
//validate token formate
if tokenString == "" || !strings.HasPrefix(tokenString, "Bearer ") {
ctx.JSON(http.StatusUnauthorized,
gin.H{"code": 401, "msg": "权限不足"})
ctx.Abort()
return
}
//
tokenString = tokenString[7:]
//
token, claims, err := common.ParseToken(tokenString)
//
if err != nil || !token.Valid {
ctx.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "权限不足"})
ctx.Abort()
return
}
//验证通过后获取claim中的userID
userId := claims.UserId
DB := common.GetDB()
var user Model.User
DB.First(&user, userId)
//用户不存在
if userId == 0 {
ctx.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "权限不足"})
ctx.Abort()
return
}
//用户存在,将user的信息写入上下午。
ctx.Set("user", user)
ctx.Next()
}
}
同时在jwt.go中增加token解析代码
func ParseToken(tokenString string) (*jwt.Token, *Claims, error) {
claims := &Claims{}
token, err := jwt.ParseWithClaims(tokenString, claims,
func(token *jwt.Token) (i interface{}, err error) {
return jwtKey, nil
})
return token, claims, err
}
本次练习到此结束。
友情援助
有问题的可以关注公众号,博主会在24小时内回复。