当前位置: 首页 > news >正文

Go-zero:JWT鉴权方式

1.简述

用于记录在go-zero的后端项目中如何添加jwt中间件鉴权

2.流程

配置api.yaml

Auth:AccessSecret: "secret_key"AccessExpire: 604800

config中添加Auth结构体

Auth struct {AccessSecret stringAccessExpire int64
}

types定义jwt token的自定义数据结构,这里以用户登录信息的UserClaims做例子,在types中新建userclaims.go文件

type UserClaims struct {UserUID int64  `json:"user_uid"`Role    string `json:"role"`jwt.RegisteredClaims
}

中间件方法:在middleware文件夹下建立jwtmiddleware.go用来储存创立和返回jwt中间件

1.jwt中间件结构体,包含一个secret字段用来实现jwt验签

// jwt中间件结构体,包含一个secret字段,用于jwt验签
type JWTMiddleware struct {Secret string
}

2.创建jwtmiddleware的实例

// 工厂方法,用于创建和返回JWTMiddleware实力
func NewJWTMiddleware(secret string) *JWTMiddleware {return &JWTMiddleware{Secret: secret}
}

3.中间件签名,接收一个函数handler,获取请求头中的token并解析,然后送入另一个handler

// 中间件签名,接受一个下一个处理的函数,返回另一个处理函数
func (m *JWTMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {//获取请求头中的tokentokenStr := r.Header.Get("Authorization")if tokenStr == "" {http.Error(w, "Missing token", http.StatusUnauthorized)return}//解析token并绑定自定义结构体UserClaimstoken, err := jwt.ParseWithClaims(tokenStr, &types.UserClaims{}, func(token *jwt.Token) (interface{}, error) {return []byte(m.Secret), nil})//检查是否有效if err != nil || !token.Valid {http.Error(w, "Invalid token", http.StatusUnauthorized)return}// 将解析结果保存进 contextif claims, ok := token.Claims.(*types.UserClaims); ok {ctx := context.WithValue(r.Context(), "user_uid", claims.UserUID)ctx = context.WithValue(ctx, "role", claims.Role)r = r.WithContext(ctx)}next(w, r)}
}

servicecontext中注册并初始化jwt中间件


type ServiceContext struct {Config        config.ConfigDB            *gorm.DBUserModel     model.IUserModelJWTMiddleware *middleware.JWTMiddleware
}func NewServiceContext(c config.Config) *ServiceContext {db, err := gorm.Open(mysql.Open(c.Mysql.DataSource), &gorm.Config{})if err != nil {panic("connect failed : " + err.Error())}_ = db.AutoMigrate(&model.User{},&model.Post{},&model.Comment{},&model.Like{},&model.Report{},&model.Section{},&model.SearchModel{},&model.InstallationStatus{})return &ServiceContext{Config:        c,DB:            db,JWTMiddleware: middleware.NewJWTMiddleware(c.Auth.AccessSecret),}}

routes中给要使用jwt的api进行包装(这里还没写需要用的api,大概语法如下)

//初始化中间件
jwtMW := middleware.NewJWTMiddleware(secret_key)
//包装需要用的api
server.AddRoutes([]rest.Route{{Method:  http.MethodPost,Path:    "/api/user_info",Handler: jwtMW.Handle(GetUserInfo(user_uid)),},},)

相关文章:

  • 车载刷写架构 --- 刷写流程中重复擦除同一地址的问题分析
  • 【MySQL】索引事务
  • 把城市变成智能生命体,智慧城市的神奇进化
  • Android开发案例——简单计算器
  • 【经验记录贴】活用shell,提高工作效率
  • 【Python进阶】列表:全面解析与实战指南
  • 设计模式每日硬核训练 Day 13:桥接模式(Bridge Pattern)完整讲解与实战应用
  • ThreadPoolExecutor 多线程用requests请求一个地址的时候为什么会报错,而多进程用requests请求一个地址的时候不会报错,为什么?
  • 04.Python代码NumPy-通过索引或切片来访问和修改
  • 【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——4G模块ME3630测试
  • TinyEngine 2.4版本正式发布:文档全面开源,实现主题自定义,体验焕新升级!
  • Java转Go记录:Slice解密
  • 负载均衡的实现方式有哪些?
  • 【大模型】DeepSeek + Coze 打造个人专属AI智能体使用详解
  • uniapp-商城-27-vuex 通用方法
  • 数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记4
  • OpenGL shader开发实战学习笔记:第十章 法线贴图
  • 记录一下Springboot项目的Security,配置
  • 第16届蓝桥STEMA真题剖析-2024年12月22日Scratch初/中级组
  • 线代第二章矩阵第三、四课:矩阵乘法和方阵的幂
  • 公司已经有域名 怎么建网站/怎么做一个免费的网站
  • 如何做网站费用多少/百度总部在哪里
  • 优斗士做网站怎么样/模板免费网站建设
  • 光谷网站开发/快速排名优化推广手机
  • 2017做哪些网站致富/百度官网客服
  • 这几年做哪些网站能致富/长沙百度seo代理