Go 认证与授权(Authentication)

news/2024/10/22 16:39:36/

场景

我们应用开发经常会遇到认证和授权问题,比如:ERP系统、OA系统、CRM系统等等,这些系统都需要用户登录后才能访问,如何实现用户登录和权限认证呢?

我们来看下对应的解决方案:

Python的装饰器模式

熟悉Python的大小朋友可能都知道Flask-JWT这个flask的extension,如何使用的?

@jwt_required()
@app.route('/user/list')
def user_list():return users

COPY

Java中认证授权

Java的认证和授权主要有以下3中方式:

  1. 放到应用Gateway去做
  2. 自定义注解,类似于Python的Decorator
  3. 自定义拦截器

.NET的方式


[Authorize(Roles = "Admin")]
public class UserController : Controller 
{[Route("api/users")]public IActionResult Get(){return Ok(new { message = "Hello World" });}
}

COPY

问题

  1. 可能会忘记使用注解或者把他们放错位置
  2. 阅读业务代码需要理解注解的意思
  3. 找不到注解的定义
  4. 控制流程被隐藏

解决方案

原生Go Http Server

Go的解决方案也比较简单,

首先定义一个认证包装器


func Authentication(h http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {// 校验if !IsAuthenticated(r) {http.Error(w, "Not authenticated", http.StatusForbidden)return}h.ServeHTTP(w, r)}
}

COPY

然后使用它:


Authentication(http.HandlerFunc(w http.ResponseWriter,r *http.Response){// 处理请求
})

COPY

最后注册路由:


serve := http.NewServeMux()// 需要验证的路由
serve.Handle("/",Authentication(http.HandlerFunc(w http.ResponseWriter,r *http.Response){
}))// 不需要验证的路由
serve.Handle("/login",http.HandlerFunc(w http.ResponseWriter,r *http.Response){
})

COPY

基于Gin的认证

也是基于中间件的认证,和上面一样,只是使用gin框架。
也是首先定义一个Authentication中间件,然后注册路由的时候使用AuthMiddleware中间件。

func AuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {tokenStr := c.GetHeader("Authorization")if tokenStr == "" {c.JSON(http.StatusUnauthorized, common.CommonResp{Message: "Unauthorized",})c.Abort()return}token, err := jwt.ParseWithClaims(tokenStr, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])}return []byte("secret"), nil})if err != nil {c.JSON(http.StatusUnauthorized, common.CommonResp{Message: "Unauthorized",})c.Abort()}if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {// 添加claims到上下文c.Set("claims", claims)c.Next()} else {c.JSON(http.StatusUnauthorized, common.CommonResp{Message: "Unauthorized",})c.Abort()}}
}

COPY

然后定义一个Public和protect group来分别处理公共接口和需要登录的接口。


v1 := r.Group("/api/v1")publicGroup := v1.Group("/")protectGroup := v1.Group("/")
protectGroup.Use(user.AuthMiddleware())user.InitRouter(publicGroup, protectGroup)

COPY

总结

处理认证和授权是业务系统场景的问题,不论你是在云上还是哪儿,同事各种编程语言和框架都会提供相应的解决方案,如Python的Flask-JWT, Java的自定义注解或拦截器,.NET的Attribute等。

无论使用哪种方法,都需要对相关的技术有深入的理解,并且在编程时要时刻注意,防止忘记使用注解,或者把注解放错位置。
阅读包含大量注解的代码也会变得困难,找不到注解的定义,或者感觉控制流程被隐藏起来了。

Go语言提供了更简洁清晰的解决方案。Go允许我们直接定义一个认证处理器并将其附加到注册路由上。我们可以自定义这个认证处理器,使其在进入handler之前进行预处理,校验请求是否已经过认证,以此实现权限控制。这样的设计使得控制流程变得清晰,且可以根据需要自由组合handler,具有很高的扩展性。

基于Gin的认证是另一种Go语言下的解决方案,借助于Gin框架,我们可以通过定义中间件的方式来处理认证问题。

参考

Go 认证与授权(Authentication) – 小厂程序员


http://www.ppmy.cn/news/1425941.html

相关文章

SQL开窗函数

文章目录 开窗函数(分析函数)分析函数名分析子句聚合类:排序类:偏移类 开窗函数(分析函数) 写法 分析函数名() OVER(分析子句)分析函数名 聚合类: SUM AVG MIN MAX COUNT 排序类:…

【RV1106的ISP使用记录之基础知识】硬件连接关系与设备树的构建

RV1106具备2个mipi csi2 dphy硬件,1个VICAP硬件和1个ISP硬件。其中: 1、mipi csi2 dphy 用于对数据流的解析,支持MIPC,LVDS,DVP三种接口; 2、VICAP用于数据流的捕获; 3、ISP用于对图像数据进行处理; 这三个…

政安晨:【深度学习神经网络基础】(九)—— 在深度学习神经网络反向传播训练中理解梯度

目录 简述 理解梯度 什么是梯度 计算梯度 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 简述 在深度…

2024年4月18号技术面试总结

1.什么是微服务雪崩?微服务雪崩的解决方案? 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。服务A依赖于服务B,服务A依赖于服务D。现在假设,服务D出现了故障! 它访问这个服务D就必然要等待服务D的结果,那因为服务D出现了故障,那必然不…

Stable Diffusion超详细教程!从0-1入门到进阶

一、本地部署 Stable Diffusion 前言 目前市面上比较权威,并能用于工作中的AI绘画软件其实就两款。一个叫Midjourney(简称MJ),另一个叫Stable-Diffusion(简称SD)。MJ需要付费使用,而SD开源免费…

移植speexdsp到OpenHarmony标准系统③

speexdsp移植后已提交至openhamrony sig仓库:https://gitee.com/openharmony-sig/contest/tree/master/2022_OpenHarmony_thirdparty/speexdsp 四、将三方库加入到OpenHarmony的编译体系 根据上一步分析结果,编写gn文件,将三方库加入到OpenH…

达梦数据库的DMRMAN工具介绍

达梦数据库的DMRMAN工具介绍 DMRMAN(DM RECOVERY MANAGER)是 DM 的脱机备份还原管理工具,由它来统一负责库级脱机备份、脱机还原、脱机恢复等相关操作,该工具支持命令行指定参数方式和控制台交互方式执行,降低了用户的…

ofd在线转换,ofd转pfd,ofd用什么软件打开

随着信息技术的不断发展,电子文档在日常办公和学习中扮演着越来越重要的角色。然而,不同格式的电子文档之间往往存在兼容性问题,这给用户在查阅、编辑和共享文件时带来了诸多不便。 一、什么是ofd文件格式? OFD,全称为…