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

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(签名)

GOLANG进阶:govalidator过滤器,MD5,JWT身份验证,redis_第1张图片

 

引入资源包

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
}

你可能感兴趣的:(GOLANG,redis,非关系型数据库,golang,gin,中间件,数据库,单例模式)