首页 > 其他分享 >go中间件实现登录验证

go中间件实现登录验证

时间:2024-01-29 10:11:33浏览次数:21  
标签:登录 fmt 中间件 token user context 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

    }

 

标签:登录,fmt,中间件,token,user,context,go
From: https://www.cnblogs.com/tony-yang-flutter/p/17993906

相关文章

  • Golang中的交叉编译
    Golang中的交叉编译在Golang中,交叉编译指的是在同一台机器上生成针对不同操作系统或硬件架构的二进制文件。这在开发跨平台应用或构建特定平台的发布版本时非常有用。交叉编译Golang程序的基本步骤如下:指定目标操作系统和工具链并设置对应的环境变量在编译时,需要指定目标......
  • Python 基于pymongo操作Mongodb学习总结
    实践环境Python3.6.4pymongo4.1.1pymongo-3.12.3-cp36-cp36m-win_amd64.whl下载地址:https://pypi.org/simple/pymongo/代码实践#!/usr/bin/envpython#-*-coding:utf-8-*-importdatetimeimportrandomimportpymongofrompymongoimportMongoClientfrombson.......
  • Typora中上传图片:使用PigGo+Gitee
    设置FFS程序下载安装程序出现两个程序。FreeFileSync是主程序,RealTimeSync用来设置自动同步打开FreeFileSync主程序,点击蓝色设置按钮比较设置界面同步设置界面一般设置双向,即只要有一边变化即同步。为了保险起见,设置保留历史版本最后确定设置需要同步的文件夹......
  • 初中英语优秀范文100篇-072Growing up with good books-伴随着好书成长
    PDF格式公众号回复关键字:SHCZFW072记忆树1Asthesayinggoes:“Knowledgeispower."翻译俗话说:“知识就是力量。”简化记忆知识句子结构As引导的短语,表示“正如……所说”,用于引用格言或谚语Knowledge作主语,是抽象名词。Is是系动词。Power作表语,是名词2We......
  • 补充:基于项目的协同过滤推荐算法(Item-Based Collaborative Filtering Recommendation
    前言继续上篇博客,继续读论文。想看上篇论文的同学可以点击这里相关工作Inthissectionwebrieflypresentsomeoftheresearchliteraturerelatedtocollaborativefiltering,recommendersystems,dataminingandpersonalization.在本节中,我们简要介绍了一些与协同......
  • go 安装grpc环境
    一:windows上安装protoc转换工具https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.4 github打不开,下载个fastgithub对应版本工具目录打开运行 再次访问protoc转换工具下载地址: 找到对应版本 下载 解压,把整个目录剪切到合适位置里面目录......
  • Godot游戏设计引擎
     Godot游戏引擎是JuanLinietsky]和ArielManzur 发起的,是一款制作游戏的软件,可以制作2D和3D游戏。通过基于节点的架构来设计游戏,3D渲染器设计可以增强3D游戏的画面。具有内置工具的2D游戏功能以像素坐标工作,可以掌控2D游戏效果。面向团队的设计从架构和工具到VCS集成,Godot专......
  • Django ORM解析
    在深入讨论Django的ORM(Object-RelationalMapping,对象-关系映射)之前,让我们先理解一下什么是ORM。ORM是一种编程技术,用于在面向对象的软件和关系数据库之间建立一种可兼容的系统。简单来说,ORM能够让你使用Python(或其他编程语言)来操作数据库,就像你在操作Python对象一样。Django的O......
  • GOLAND 中 使用GORM ,出现 未发现“mysql”driver
    错误描述:sql:unknowndriver"mysql"(forgottenimport?)panic:runtimeerror:invalidmemoryaddressornilpointerdereference 解决过程:1、清除缓存2、添加包import_"github.com/go-sql-driver/mysql"_(下划线)用于导入包但不使用它的情况。......
  • Go - 基本数据类型和其字符串表示之间转换
    1.基本数据类型和其字符串表示之间转换基本类型的值,都有一个字符串表示,如数字类型值1字符串表示为"1",字符的编码为Unicode或者UTF-8,数字的编码是int,底层存储的数据格式本质上不一样,基本类型的转换本质上只是文法语义上的转化1.1Go语言基本类型整数:有符号intint8i......