Go 认证与授权(Authentication)

场景

我们应用开发经常会遇到认证和授权问题,比如: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.mzph.cn/news/814203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员Java.vue,python前端后端爬虫开发资源分享

bat面试资料 bat面试题汇总 提取码:724z 更多资料

项目总体测试计划书

目的:编写此测试方案的目的在于明确测试内容、测试环境、测试人员、测试工作进度计划等,以保证测试工作能够在有序的计划安排进行。 测试目标:确保XXX项目的需求分析说明书中的所有功能需求都已实现,且能正常运行;确保…

【Web】DASCTF 2023 0X401七月暑期挑战赛题解

目录 EzFlask MyPicDisk ez_cms ez_py 让俺看看401web题 EzFlask 进来直接给了源码 import uuidfrom flask import Flask, request, session from secret import black_list import jsonapp Flask(__name__) app.secret_key str(uuid.uuid4())def check(data):for i i…

nuxt.config.js配置

babel 预设在构建客户端/服务端的版本。 默认为 nuxt/babel-preset-app 在client构建中是ie:9,在server构建中是node:current。 build.babel.presets 中配置的预设将应用于客户端和服务器构建。目标将由 Nuxt 相应地设置(客户端/服务器&#…

React ant 点击导航条闪烁

问题 : 点击当前位置会出现闪一下的效果 另一种点击方式 , 不会闪 原因 : 没有传递具体的参数给点击事件 , 导致在函数内部无法准确判断要展示哪个子菜单,可能导致页面状态的短暂变化,出现闪烁效果 代码 : // 左侧子菜单弹出const showSonMenu routeK…

【数据挖掘】实验7:高级绘图(上)

实验7:高级绘图(上) 一:实验目的与要求 1:了解R语言中各种图形元素的添加方法,并能够灵活应用这些元素。 2:了解R语言中的各种图形函数,掌握常见图形的绘制方法。 二:实…

python-study-day1

ps:前言 可做毕设,html,web,app,小程序,bug修改,可加急 作者自述 作为一名前端开发工程师,这个大环境不好的情况下,我试过我前端接单子但是没有后端&#xff0c…

用java实现单链表的头插,尾插和反转

今天来练习以下单链表的一些操作,以下的操作都是带有头节点的链表。 定义链表节点类 定义了节点中的值,节点的下一个节点,和一些基本的方法。 public static class ListNode{int val;ListNode next;public ListNode() {}public ListNode(in…

NPM 命令备忘单

NPM 简介 Node Package Manager (NPM) 是 Node.js 环境中不可或缺的命令行工具,充当包管理器来安装、更新和管理 Node.js 应用程序的库、包和模块。对于每个 Node.js 开发人员来说,无论他们的经验水平如何,它都是一个关键工具。 NPM 的主要…

pom.xml显示灰色并被划线

在使用 IDEA 进行开发的过程中,有时候会遇到 pom.xml 显示灰色并被划线的情况,如下图: 这一般是因为该文件被 Maven 忽略导致的,可以进行如下操作恢复: 设置保存后,可以看到 pom.xml 恢复了正常&#xff1a…

计算机网络书籍--《网络是怎样连接的》阅读笔记

第一章 浏览器生成信息 1.1 生成HTTP请求信息 1.1.1 URL Uniform Resource Locator, 统一资源定位符。就是网址。 不同的URL能够用来判断使用哪种功能来访问相应的数据,比如访问Web服务器就要用”http:”,而访问FTP服务器用”ftp:”。 FTP&#xff…

支付系统核心逻辑 — — 状态机(JavaGolang版本)

支付系统核心逻辑 — — 状态机 代码地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/state_machine_demo 1 概念:FSM(有限状态机),模式之间转换 状态机,也叫有限状态机&#xff08…

label 的作用是什么?如何使用?

label标签来定义表单控件的关系&#xff1a;当用户选择label标签时&#xff0c;浏览器会自动将焦点转到和label标签相关的表单控件上。 使用方法1&#xff1a; <label for"mobile">Number:</label> <input type"text" id"mobile&quo…

Linux Docker挂载群晖WebDAV到本地

挂载群晖的WebDAV&#xff0c;使用群晖的WebDAV Server搭建的服务。 群晖配置了证书。 使用镜像&#xff1a; docker-webdav-client docker run -it --rm \--device /dev/fuse \--cap-add SYS_ADMIN \--security-opt "apparmorunconfined" \--env "WEBDRIVE_U…

零基础如何学习linux知识

零基础学习Linux需要一个结构化和逐步深入的学习计划。以下是一个学习方向和框架仅供参考&#xff1a; 一&#xff0c; 学习方向 1. **了解Linux基础**&#xff1a; - 理解开源概念。 - 了解Linux的历史和它的重要性。 - 认识不同的Linux发行版。 2. **命令行操作*…

基于OptiTrack跟踪系统和Turtlebot机器人的视觉SLAM定位评估

本文旨在介绍使用OptiTrack光学跟踪系统和Turtlebot机器人进行视觉SLAM定位实验的详细流程&#xff0c;包括实验平台搭建过程、数据处理过程以及SLAM估计评估方法。由于涉及知识较多&#xff0c;部分内容只给出了相关参考博文链接。 1 实验平台搭建 实验平台包括OptiTrack光学…

Golang | Leetcode Golang题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; func removeDuplicates(nums []int) int {n : len(nums)if n 0 {return 0}slow : 1for fast : 1; fast < n; fast {if nums[fast] ! nums[fast-1] {nums[slow] nums[fast]slow}}return slow }

前端面试问题汇总 - HTTP篇

1. 登录拦截如何实现&#xff1f; 在前端&#xff0c;可以拦截所有需要登录的请求&#xff0c;如果用户未登录或者登录过期&#xff0c;则跳转到登录页面。 2. http 缓存有哪些&#xff1f; 强缓存&#xff1a; 强缓存是指在客户端请求资源时&#xff0c;先检查本地是否存在缓存…

uniapp实现事件级防抖

背景&#xff1a; uniapp项目中所有页面跳转都会触发多次点击事件&#xff0c;导致页面排版错乱或其他问题 在utils文件夹下创建debounce.js文件 export const Debounce (fn, wait) > {let delay wait || 500let timerreturn function() {let args arguments;if (time…

CentOS 7软件安装全攻略:YUM命令详解与实战

在CentOS 7中&#xff0c;软件安装主要依赖于其强大的包管理器——YUM&#xff08;Yellowdog Updater Modified&#xff09;。YUM可以自动解决软件包之间的依赖关系&#xff0c;使得软件的安装、更新和卸载变得简单而高效。本文将详细介绍CentOS 7中软件安装的相关命令、选项和…