GOLANG进阶:govalidator过滤器,MD5,JWT身份验证,redis

go整合redis、jwt 本人是做java开发的,最近突然对go提起了兴趣,看了n篇大牛文章后,所谓好好学习天天向上,故有了本篇: (一)整合redis "github.com/garyburd/redigo/redis" 举个最简单的例子,存储发送的验证码: redisutil.go package redis import ( "errors" "github.com/garyburd/redigo/redis" "math" "time" ) type Redis struc... 阅读详情

1.govalidator过滤器:类似于正则匹配,主要放在结构体注释部分,有些验证没有,需要自己替换(把required部分替换成正则表达式)

引入资源包(两种方式):

go get github.com/asaskevich/govalidator

go get gopkg.in/asaskevich/govalidator.v10

代码(可以写在结构体中,也可以单独使用):

type User struct {
    gorm.Model
    USERNAME string `json:"name" validate:"min=0,max=35"`
    PASSWOR string `validate:"required"`
    SEX int8  `validate:"required"`
    PHONE string  `validate:"required"`
    EMAIL string `validate:"required,email"`
    ADDRESS string `json:"address" validate:"lte=0,gte=90"`
    STATUS int8 `validate:"required"`
    LOGINTIME time.Time `validate:"required"`
    LOGINIP string `validate:"required"`
    LOGOUTTIME time.Time `validate:"required"`
}

2.MD5加密:不可逆加密(框架内置,不需要额外引入包)

//小写版本
func Md5string(str string)  string{
    //初始化
    h := md5.New()
    //转换成文件流
    h.Write([]byte(str))
    temp :=h.Sum(nil)
    //输出
    return hex.EncodeToString(temp)
}

//大写版本
func MD5string(str string)  string{
    //初始化
    h := md5.New()
    //转换成文件流
    h.Write([]byte(str))
    temp :=h.Sum(nil)
    //输出
    return strings.ToUpper(hex.EncodeToString(temp))
}

3.jwt结构(JSON Web令牌):它是一个签名的JSON对象,可以做一些验证类的事情,可以看成是服务器发出的令牌,每次有新请求就会去验证(单点登录),如果是验证错误直接退出当前流程

组成部分

1.Header(标头)

2.Payload(有效载荷 )

3.Signature(签名)

 

引入资源包

go get -u github.com/dgrijalva/jwt-go

代码:

import (
    "fmt"
    "github.com/dgrijalva/jwt-go"
    "github.com/gin-gonic/gin"
    "time"
)

type Claim struct {
    USERNAME string `josn:"userbane" validate:"required"`
    PASSWORD string `josn:"password" validate:"required"`
    //jwt标准结构
    jwt.StandardClaims
}

//密码(自定义:最好是写在配置文件,配合redis取用)
var jwtkey = []byte("local")

func main()  {
    //初始化
    g := gin.Default()
    g.GET("indexs",Indexs)
    g.GET("indexparse",Parsetoken)
    g.Run(":8080")
}

func Indexs(ctx *gin.Context)  {
    //获取参数
    uarname := ctx.Query("uarname")
    password := ctx.Query("password")
    expireTime := time.Now().Add(7 * 24 * time.Hour)

    //赋值
    claims := &Claim{
        USERNAME: uarname,
        PASSWORD: password,
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: expireTime.Unix(), //过期时间
            IssuedAt:  time.Now().Unix(),//起始时间
            Issuer:    "127.0.0.1",  // 签名颁发者
            Subject:   "token", //签名主题
        },

    }
    //生成秘钥
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    //获取秘钥
    tokenString, _ := token.SignedString(jwtkey)
    ctx.JSON(200,gin.H{
        "ping":tokenString,
    })
}

func Parsetoken(ctx *gin.Context)  {
    //接收参数
    tokenst := ctx.GetHeader("Authorization")
    //判断参数是否为空
    if tokenst=="" {
        ctx.JSON(400,gin.H{
            "ping":"参数错误",
        })
    }
    //解码
    token, claims, err := ParseToken(tokenst)
    if err != nil || !token.Valid {
        ctx.JSON(400, gin.H{"ping":"秘钥错误"})
        ctx.Abort()//调过剩余的方法,直接返回
        return
    }

    //打印结构体(解码回传数据)
    fmt.Println(claims)
}

//解码方法
func ParseToken(tokenString string)  (*jwt.Token,*Claim,error){
    //初始化结构体
    Claims := &Claim{}
    //内置解码方法
    token, err := jwt.ParseWithClaims(tokenString, Claims, func(token *jwt.Token) (i interface{}, err error) {//匿名方法(可以分开写,也可以按照现在这样)
        return jwtkey, nil
    })
    return token, Claims, err
}

4.redis:非关系型数据库(具体了解可以看博主之前的文章)

引入资源包

go get -u github.com/go-redis/redis

//代码示例

import (
   "fmt"
   "github.com/go-redis/redis"
   "github.com/spf13/viper"
)

func Initredis() (errreback error) {
   //vip获取配置
   viper.SetConfigName("app")
   viper.AddConfigPath("config")
   err := viper.ReadInConfig()
   if err != nil {
      fmt.Println("redis参数配置错误")
   }

   //链接参数
   Rdb := redis.NewClient(&redis.Options{
      //链接地址
      Addr:     viper.GetString("redis.local") + ":" + viper.GetString("redis.port"),
      //链接密码
      Password: viper.GetString("redis.password"),
      //默认数据库
      DB:0,
      //Redis连接池大小
      PoolSize: 10,
      //最大重试次数
      MaxRetries: 3,
   })

   //链接
   _, err = Rdb.Ping().Result()
   if err != nil {
      fmt.Println("redis链接错误")
   }

   //返回值
   return nil
}
【读代码】SQLBot:开源自然语言转SQL智能助手原理与实践 SQLBot是 DataEase 团队开源的自然语言转 SQL 智能助手,致力于让非技术用户也能通过自然语言与数据库对话,自动生成 SQL 查询,实现自助数据分析、智能BI问答、报表生成等场景。SQLBot 结合了大语言模型(LLM)、数据库元数据解析、SQL解析与执行等多项技术,具备强大的多数据库适配能力和灵活的扩展性。降低数据分析门槛,让业务人员无需掌握SQL即可获取数据洞察支持多种数据库类型,适应企业多样化数据环境提供可扩展的API和插件机制,便于集成到各类BI、数据平台和业务系统。 阅读详情

相关推荐

从零构建Carsim线控转向仿真:模型搭建、算法集成与整车联动实战

本文详细介绍了从零开始基于Carsim和Simulink搭建线控转向仿真模型的完整实战流程。内容涵盖RWA前轮执行器动力学建模与PID控制、卡尔曼滤波器估算齿条力、HWA方向盘手感模拟算法设计,以及最终实现HWA与RWA闭环联动并进行整车仿真调试。通过分步拆解,帮助读者深入理解线控转向系统的核心原理与工程实现。

weixin_29158413的博客 251

golang服务器后端服务:JWT+Redis实现用户登录验证

redis存储: // 构建redis用户数据 rdsData := make(map[string]interface{}, 3) rdsData["user"] = user //用户信息的结构体 models.User rdsData["pkY"] = pk.KeyY //jwt ECDSA解析需要用到的KeyY rdsData["prodId&q

Mirage 8019

RK3566开发板实战:YT8512C百兆网卡调试全记录(附DTS配置避坑指南)

本文详细记录了RK3566开发板上YT8512C百兆以太网卡的调试全过程,包括硬件信号检测、DTS配置优化及常见错误排查。特别针对DTS配置中的关键参数和避坑指南进行了深入解析,为开发者提供实用的调试技巧和经验分享。

weixin_29189381的博客 272

Golang 过滤器设计模式(六)

上一篇:适配器设计模式https://blog.youkuaiyun.com/weixin_40165163/article/details/90716357 github:https://github.com/zhumengyifang/GolangDesignPatterns 过滤器设计模式 wiki百科:过滤器设计模式或标准模式是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通...

王佳宇的个人博客 7578

Yolov5s/Yolov8s网络结构图

yolov8、yolov5网络结构图

Goodness2020的博客 9925

MATLAB实战:用ARMAX模型搞定电力系统惯量评估(附完整代码)

本文详细介绍了如何利用MATLAB中的ARMAX模型进行电力系统惯量评估,解决新能源占比提高带来的系统惯量下降问题。通过系统辨识技术,从电网运行数据中准确提取惯量参数,并提供完整的代码实现,帮助工程师快速应用于实际工程。

peach的博客 637

go ip过滤_Go / GoLang检查范围内的IP地址

In Go/GoLang, what is the fastest way to check if an IP address is in a specific range?For example, given range 216.14.49.184 to 216.14.49.191, how would I check if a given input IP address is in that...

weixin_33585889的博客 911

得利捷datalogic扫码枪调试说明

针对得利捷datalogic扫码枪快速调试并,可以根据详细步骤设置扫码枪,并配有tcp调试助手辅以验证,以达到快速调试完成扫码枪的工作。

Conway510的博客 1万+

JWT、Redis常见问题整理

答案:雪花ID(Snowflake)是Twitter开源的一种分布式ID生成算法,它可以生成一个全局唯一的64位整数,其中包含了时间戳、工作机器ID、序列号等信息。雪花ID的优点是:1)高效:通过位运算实现高效的ID生成;2)唯一性:生成的ID全局唯一,且按照时间递增排序;3)可反解:由于ID中包含时间戳等信息,因此可以根据ID反解出生成时间、工作机器ID等信息。缺点是:1)依赖机器时钟:如果机器时钟不准确,会导致生成的ID不唯一;2)有一定的并发问题:如果同一毫秒内多个请求生成ID,可能会导致序列号重复。

weixin_44797986的博客 736

天龙八部TLBB系列 - 网单用数据库修改为其他门派

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等) --- 天龙八部修改门派

空名先生 9430

UMI——斯坦福刷盘机器人:通过手持夹爪革新数据收集方式,且使用视觉SLAM和Diffusion Policy预测动作

没想到今年年初的斯坦福mobilealoha的热度刚过,而到今年2月的下旬,斯坦福另一个团队又推出了UMI刷盘机器人,且这两个团队还互相认识、还在一块共同切磋(顺带小小感叹一下,斯坦福的氛围是真好而且真高产)斯坦福UMI刷盘机器人其与mobile aloha(以及AirExo: Low-Cost Exoskeletons for Learning Whole-Arm Manipulation in the Wild)最大的不同在于其收集数据处理的非真实的机器人,而是一个手持夹持器(从而大幅降低成本)

u013250861的博客 1357

validator进行参数校验、自定义校验规则、使用正则表达式

一、使用 github.com/go-playground/validator/v10 进行参数校验 安装 validator:go get "github.com/go-playground/validator/v10" 二、实现代码如下: var ( validate = validator.New() _ = validate.RegisterValidation("companyIdValidation", C

Lawson的博客 6267

基于STC8G1K08A单片机的7位PWM输出程序(PCA功能实现呼吸灯效果)

摘要:本文展示了基于STC8G单片机的PWM占空比控制实现。通过定时器0中断每5ms调整占空比(0-127范围),实现呼吸灯效果。关键代码包括:1)PWM初始化(7位PWM模式);2)定时器配置(1ms中断);3)主循环根据标志位动态调整占空比。硬件采用P5.4引脚输出PWM信号,通过direction标志实现占空比自动增减循环。该方案适用于LED亮度调节等场景,系统时钟24MHz,采用12T模式。

weixin_74013772的博客 864

编写GO的WEB开发框架 (六): Validator数据校验

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34358365的博客 421

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

golang常见的AES、DES、RSA、MD5加密、解密、加签、验签

PKCS5 填充:PKCS5 填充方案适用于使用 64 位块大小的对称加密算法(如 DES),其中填充字节的值与填充的字节数相同。PKCS5 填充和 PKCS7 填充实际上是相同的,只是在应用 PKCS5 填充时,块大小固定为 64 位。PKCS7 填充:PKCS7 填充方案适用于使用任意块大小的对称加密算法,例如 AES 的块大小可以是 128 位(16 字节),而 DES 的块大小是 64 位(8 字节)。实际上,PKCS7 填充方案已经替代了 PKCS5 填充方案,并成为广泛使用的填充方式。

qq_39272466的博客 2403

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Golang字符串过滤

【代码】Golang字符串过滤。

qq_29744347的博客 1049

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

golang中map和slice封装过滤寻找

可以使用建立自定义方法,比如过滤、寻找……方便扩展,代码看起来更简洁下面是我的演示代码package main import("fmt" "sort" "time" "github.com/samber/lo") // 添加一下自定义 map 类型 type MyMap map [ string ] interface {} // 格式化时间 func(my MyMap) formTime(names ... string) MyMap {

qq_39272466的博客 355

Go + FFmpeg交互丨学习记录

注:本文未完待续使用 Golang 和 FFmpeg 交互可以分为以下几个步骤:安装 FFmpeg: 首先需要安装 FFmpeg,可以在终端中输入命令来安装。创建一个Golang项目,并在其中创建一个接收上传视频文件的接口。在接口中接收上传的文件,并使用Golang中的 exec 包来执行 FFmpeg 命令来转码视频。转码后的文件可以保存在本地或上传到云存储服务器。将视频信息存储到 MySQL 数据库中。在Golang中使用GORM或其他ORM库来连接数据库并存储数据。

irainsa的博客 1962

golang基于FFmpeg实现视频H264编解码

、

weixin_54792212的博客 4631

百万级并发IM即时消息系统(5)校验器govalidator

gorm.Model //告诉数据库这个结构体映射一张表,同时数据库操作需要更新里面的几个时间戳Phone string `valid:"matches(^1[3-9]{1}\\d{9}$)"` //正则表达式用于校验号码Email string `valid:"email"` //校验邮箱格式Avatar string //头像。

m0_50973548的博客 162

【golang自学之路(四)】实现一账号N地登录问题!redis+JWT实现详讲

使用redis+JWT实现了一个账号多地登录。这里有一点美中不足,就是方法中这段代码如果能从viper的配置中读取,并改写,可以实现一个账号任意N地登录。

qq_42961251的博客 1453

golang常用库:字段参数验证库-validator使用

一、背景# 在平常开发中,特别是在web应用开发中,为了验证输入字段的合法性,都会做一些验证操作。比如对用户提交的表单字段进行验证,或者对请求的API接口字段进行验证,验证字段的合法性,保证输入字段值的安全,防止用户的恶意请求。 一般的做法是用正则表达式,一个字段一个字段的进行验证。一个一个字段验证的话,写起来比较繁琐。那有没更好的方法,进行字段的合法性验证?有, 这就是下面要介绍的validator这个验证组件。 代码地址:https://github.com/go-playground/val..

hellozhxy的博客 5233

GoValidator 教程:验证Go语言结构体和数据类型

**GoValidator** 是一个用于Go语言的轻量级验证库,它允许对结构体字段以及单独的数据值进行验证。这个库支持各种验证规则,例如检查字符串的长度、是否是有效的电子邮件地址等。它还包括对数组和映射的迭代处理,以执行自定义验证操作。 ## 2. 项目快速启动 ### 安装 要将GoValidator添加到你的项目中,使用以下命令: ```bash go get github.com/a...

gitblog_00110的博客 500

golang常用库之字段参数验证库-validator使用详解

golang常用库之字段参数验证库-validator使用详解

qq_31389153的博客 3036

golang学习笔记02——gin框架及基本原理

gin框架是golang中比较常见的web框架,截止到目前(2023-03-21),github上已经累计了67.3K的star数,这足以表明其优秀。作为一名想要知其然亦想知其所以然的程序员,希望通过学习gin框架的实现原理来提高自己的技术能力,也希望通过分享来帮助想要进行学习的同学。框架源码地址: https://github.com/gin-gonic/gin。

GoppViper的博客 2185

GO学习笔记 - 数据校验

本文主题:基于asaskevich/govalidator实现Golang数据校验 小慢哥的原创文章,欢迎转载 目录 ▪ 一. asaskevich/govalidator介绍▪ 二. 字符串匹配▪ 三. struct元素匹配▪ 四. struct元素可选验证▪ 五. struct嵌套校验▪ 六. 无法实现嵌套的可选校验▪ 七. 个人最佳实践▪ 八. 其他功能▪ 附录1. 字符串合法性校验▪ ...

changzhe1253的博客 837
上一篇: GOLANG进阶:Viper,Mysql,Swagger,Log
下一篇: GOLANG进阶 之 接口(interface) 与 管道(channel)
masterphp
博客等级 码龄5年 247粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值