go中间件实现登录验证

一、概述

  在java中可以使用过滤器、拦截器实现登录验证(验证token的有效性、判断哪些路径需要登录、哪些路径不需要登录)等等的一些公共性的验证操作。

  go语言中有没有类似的东西呢,答案是有的,go语言中可以使用中间件来完成这个操作。

  接下来使用gin+中间件的形式来验证token的有效性(公共/通用验证)

  验证步骤:

    1.登录时生成token

    2.添加中间件

    3.在中间件中验证token的有效性,并判断哪些接口可以不登录访问,哪些接口必须登录后才能访问

二、代码示例

  1.调用登录接口生成token

// 登录
func loginHandler(context *gin.Context) {
    var user entity.User
    err := context.ShouldBindJSON(&user)
    fmt.Println("登录参数:", user)
    if len(user.Phone) == 0 || len(user.Pwd) == 0 {
        response.ShowError(400, "用户名密码不能为空", context)
        return
    }
    if err != nil {
        response.ShowError(400, "参数异常:"+err.Error(), context)
        return
    }
    userTable := connectMySql().Table("user").Debug()

    var count int64
    err1 := userTable.Where("phone=?", user.Phone).Count(&count).Error
    fmt.Println("是否有记录:", count)
    if count <= 0 || err1 != nil {
        response.ShowError(200, "没有此用户", context)
        return
    }
    var users []entity.User
    //加上debug说明输出sql执行的操作(出于debug模式)
    err2 := userTable.Where("phone=? AND pwd=?", user.Phone, user.Pwd).Find(&users).Error
    fmt.Println(len(users))
    fmt.Println(users)
    // err2 := userTable.Where(&entity.User{Phone: user.Phone, Pwd: user.Pwd}).Find(&users).Error
    if len(users) <= 0 || err2 != nil {
        response.ShowError(200, "用户名或密码不正确", context)
        return
    }
    //生成token
    mToken, err3 := token.CreateToken(users[0])
    if err3 != nil {
        response.ShowError(200, "token生成失败", context)
        return
    }
    response.ShowSuccess(mToken, context)
}

 

  2.添加中间件

//使用中间件,其中CheckToken()中间件方法
router.Use(CheckToken())

 

  3.在中间件中验证token

/ 中间件
func CheckToken() gin.HandlerFunc {
    return func(context *gin.Context) {
        fmt.Println("路径:", context.FullPath())
        mPath := context.FullPath()
        strPaths := []string{//登录和注册接口放行
            "/user/login",
            "/user/register",
        }
        flag := false
        for _, value := range strPaths {
            if value == mPath {
                flag = true
            }
        }
        if !flag {
            fmt.Println("不包含")
            authorization := context.GetHeader("Authorization") //获取token
            fmt.Println("header:Authorization", authorization)
            //||!strings.HasPrefix(authorization,)
            if authorization == "" {
                response.ShowError(401, "token为空", context)
                context.Abort()
                return
            }
            //解析token
            mToken, claims, err := token.ParseToken(authorization)
            fmt.Println("token:", mToken)
            fmt.Println("claims:", claims)
            if err != nil || !mToken.Valid { //解析错误或者token过期
                response.ShowError(401, "token过期/错误"+err.Error(), context)
                context.Abort()
                return
            }
            context.Set("id", claims.Id)
        } else {
            fmt.Println("包含")
        }
        context.Next()
        // claims.Id
        // return claims.Id, nil

    }

 

posted on 2024-01-29 10:07  飘杨......  阅读(23)  评论(0编辑  收藏  举报