golang通用后台管理系统04(jwt的Token认证)

1.修改之前的接口路由文件

package main

import (
	"fmt"

	//测试接口-路由
	ginCtrl "gin/controller"
	sysUtil "gin/system/util"
	"github.com/gin-gonic/gin"
	"log"
	//系统基础功能接口--路由
	sysCtrl "gin/system/controller"
)

func main() {

	apiV1 := gin.Default()
	exploreRouter := apiV1.Group("/api")

	//没有数据库交互的接口
	//r := gin.Default()
	exploreRouter.GET("/get", func(ctx *gin.Context) {
		ctx.String(200 /*http.StatusOK*/, "hello word golang-web!")
	})

	exploreRouter.POST("/user/post", func(ctx *gin.Context) {
		ctx.String(200, "这是一个post请求!")
	})

	exploreRouter.PUT("/user/put", func(ctx *gin.Context) {
		ctx.String(200, "这是一个put请求!")
	})

	exploreRouter.DELETE("/user/delete", func(ctx *gin.Context) {
		ctx.String(200, "这是一个delete请求!")
	})

	//有数据库交互的接口
	get请求 返回json
	exploreRouter.GET("/getJson", ginCtrl.GetUserInfo)

	get请求 返回json 接口传参
	exploreRouter.GET("/getJson/:id", ginCtrl.GetUserInfo)

	POST请求 返回json 接口传参json
	exploreRouter.POST("/postJson", ginCtrl.PostUserInfo)

	异常捕获
	exploreRouter.GET("/getErr", ginCtrl.GetDb)

	异常捕获
	exploreRouter.GET("/getDb", ginCtrl.GetDb)



	//TODO -------------------------------------system系统功能模块接口路由-登录相关接口----------------------------------
	//1.登录验证返回token 接口白名单,不校验是否携带token
	exploreRouter.POST("/login", sysCtrl.Login)

	//2密码生成
	exploreRouter.POST("/rsapassword", sysCtrl.Rsapassword)


	//TODO -------------------------------------system系统功能模块接口路由-用户操作相关接口----------------------------------
	//TODO JWT 拦截、验证token  参考  https://blog.****.net/ic_xcc/article/details/120433968

	exploreRouter.Use(sysUtil.AuthMiddleware())//token验证中间件
	 {
		 //POST请求 db操作,新增数据
		 exploreRouter.POST("/addDb", sysCtrl.SaveUser)

		 //GET请求 db操作,按id查询数据
		 exploreRouter.GET("/getByIdDb", sysCtrl.GetUserById)

		 //GET请求 db操作,查询数据
		 exploreRouter.GET("/getByUserList", sysCtrl.GetByUserList)

		 //GET请求 db多表orm操作,查询数据
		 exploreRouter.GET("/getByUserJoinList", sysCtrl.GetByUserJoinList)
	 }












	// 设置 release模式
	//gin.SetMode(gin.ReleaseMode)

	// 或者 设置debug模式
	gin.SetMode(gin.DebugMode)

	err := apiV1.Run(":9999")
	if err != nil {
		log.Fatalln("服务启动失败,原因:", err)
	} else {
		fmt.Println("服务启动成功,后端接口请访问 127.0.0.1:9999")
	}
}

2. JWT 的TOKEN认证

package util

import (
	"fmt"
	"gin/common"
	sysentity "gin/system/entity"
	"github.com/dgrijalva/jwt-go"
	"github.com/gin-gonic/gin"
	"net/http"
)

// ParseJwtToken 解析token得到是自己创建的Claims
func ParseJwtToken(jwtToken string) (*sysentity.JwtClaims, error) {
	var secretKey = []byte("login_user_key")
	var jwtclaim = &sysentity.JwtClaims{}
	fmt.Println("ParseJwtToken=========================TOKEN:-----------"+jwtToken)
	_, err := jwt.ParseWithClaims(jwtToken, jwtclaim, func(*jwt.Token) (interface{}, error) {
		//得到盐
		return secretKey/*sysentity.Secret*/, nil
	})

	if err != nil {
		if ve, ok := err.(*jwt.ValidationError); ok {
			if ve.Errors&jwt.ValidationErrorMalformed != 0 {
				return nil, sysentity.TokenMalformed
			} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
				// Token is expired
				return nil, sysentity.TokenExpired
			} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
				return nil, sysentity.TokenNotValidYet
			} else {
				return nil, sysentity.TokenInvalid
			}
		}
	}else {
		fmt.Println("ParseJwtToken==========================解析没有错误")
	}
	return jwtclaim, nil
}

//token校验
// 校验token中间件
func AuthMiddleware() gin.HandlerFunc {
	//	var tokeString = ""
	//var c *gin.Context
	return func(c *gin.Context) {
		// 从请求头中获取token
		tokeString := c.GetHeader("Token")
		fmt.Println("==================================请求头中的token为:" + tokeString)
		if tokeString == "" {
			c.JSON(http.StatusOK, gin.H{
				"code":    405,
				"message": "必须传递token",
			})
			c.Abort()
			return
		}

		claims, err := ParseJwtToken(tokeString)
		if claims == nil {
			common.ReturnError(c, 500, "token解析错误,请联系开发人员处理!", "", int64(len("")))
			panic("")
		}

		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"code":    1005,
				"message": "token解析错误",
			})
			c.Abort()
			//return
			//common.ReturnError(c, 500, "token解析错误", "", int64(len("")))
		}
		// 从token中解析出来的数据挂载到上下文上,方便后面的控制器使用
		fmt.Println("===============claims.UID" + claims.Uuid)
		//fmt.Println("===============claims.UserName" + claims.UserName)
		c.Set("Uuid", claims.Uuid)
		c.Set("UserName", claims.UserName)
		c.Next()
	}
}

3.测试

上一篇:springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘


下一篇:【CSS】CSS 样式重置 (normalize.css 和 reset.css) 和通用样式配置