1、依赖与安装

步骤命令说明
安装(或升级) go-redis v9.9+go get github.com/redis/go-redis/v9@latestentraid 必须 ≥ 9.9.0
安装 go-redis-entraidgo get github.com/redis/go-redis-entraid自动拉取 transit 依赖

2、认证方式一览

方式说明创建 StreamingCredentialsProvider 工厂函数
服务主体 (Service Principal)适合 CI/CD、后台任务entraid.NewConfidentialCredentialsProvider
系统分配托管身份 (System-Assigned MI)VM / App Service 自动生成entraid.NewManagedIdentityCredentialsProvider
用户分配托管身份 (User-Assigned MI)可跨资源共享,同一 client ID同上,ManagedIdentityType: identity.UserAssignedObjectID

⚠️ 重要字段对照表

字段在 Azure 门户/CLI 对应
ClientID应用(服务主体) / 托管身份的客户端 ID
ClientSecret应用机密 (仅服务主体)
TenantIDEntra ID 租户 ID,common=多租户
UserAssignedObjectID用户分配身份的对象 ID

3、最小可运行示例(系统分配托管身份)

package mainimport ("context""log""os""github.com/redis-developer/go-redis-entraid/entraid""github.com/redis-developer/go-redis-entraid/identity""github.com/redis/go-redis/v9"
)func main() {endpoint := os.Getenv("REDIS_ENDPOINT") // 例: "<host>:6380"if endpoint == "" {log.Fatal("请设置 REDIS_ENDPOINT 环境变量")}// 1) 生成凭据提供器provider, err := entraid.NewManagedIdentityCredentialsProvider(entraid.ManagedIdentityCredentialsProviderOptions{ManagedIdentityProviderOptions: identity.ManagedIdentityProviderOptions{ManagedIdentityType: identity.SystemAssignedIdentity,},})if err != nil {log.Fatalf("创建凭据提供器失败: %v", err)}// 2) 创建 Redis 客户端(TLS 建议保持默认 6380)rdb := redis.NewClient(&redis.Options{Addr:                       endpoint,StreamingCredentialsProvider: provider,})defer rdb.Close()// 3) 测试连接if err := rdb.Ping(context.Background()).Err(); err != nil {log.Fatalf("连接 Redis 失败: %v", err)}log.Println("Azure Managed Redis 连接成功!")
}

4、自定义刷新与重试策略

options := entraid.CredentialsProviderOptions{TokenManagerOptions: manager.TokenManagerOptions{ExpirationRefreshRatio: 0.7,  // token 生命周期过 70% 就开始刷新LowerRefreshBounds:     10_000, // 最少剩余 10s 仍会强制刷新RetryOptions: manager.RetryOptions{MaxAttempts:      3,InitialDelay:     1 * time.Second,BackoffMultiplier: 2.0,IsRetryable: func(err error) bool {return strings.Contains(err.Error(), "network") ||strings.Contains(err.Error(), "timeout")},},},
}
provider, _ := entraid.NewManagedIdentityCredentialsProvider(entraid.ManagedIdentityCredentialsProviderOptions{CredentialsProviderOptions:  options,ManagedIdentityProviderOptions: identity.ManagedIdentityProviderOptions{ManagedIdentityType: identity.UserAssignedObjectID,UserAssignedObjectID: "<client-id>",},},
)

5、常见坑与调试

症状排查步骤
ERR invalid username or password确认 AMR 实例已启用 Entra ID 认证,且 AAD 角色已赋值 (Cache Contributor/Access 等)。
证书握手失败连接端口 6380 需 TLS;如本地测试可开启 DisableTLS (不建议生产)。
token 过期,自动刷新失败检查托管身份有无 Azure Redis Cache Contributor 角色;或自定义 RetryOptions
使用服务主体 but 权限不足记得把 SP 用 az redis identity assign 绑定,并授予 RBAC 角色。
User-Assigned MI 无法获取 tokenManagedIdentityType 与传入字段需匹配 (UserAssignedObjectID / UserAssignedClientID)。

6、参考链接

  • GitHub ▸ https://github.com/redis-developer/go-redis-entraid
  • 官方文档 ▸ Azure Cache for Redis – Microsoft Entra ID authentication
  • 示例 CLI ▸ az redis identity assignaz ad sp create-for-rbac

小结

  1. 选身份:服务主体适合脚本 & CI;托管身份零密钥更安全。
  2. 三步走:创建 CredentialsProvider → NewClient 注入 → Ping 验证。
  3. 生产必配RetryOptions & ExpirationRefreshRatio,及时刷新 token。

按照以上说明即可安全、优雅地在 Go 项目中连接 Azure Managed Redis,享受 Entra ID 带来的统一身份与密钥免维护体验。祝编码顺利 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92216.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92216.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/92216.shtml

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

相关文章

window上docker安装RabbitMQ

1、要进http://localhost:15672管理页面需要安装management版本2、搜索镜像并pull3、启动镜像时将端口映射出来4、启动成功&#xff0c;点击可查看日志详情&#xff0c;浏览器访问5、直接使用guest/guest登录会报错User can only log in via localhost解决办法有两个&#xff1…

异世界历险之数据结构世界(排序(插入,希尔,堆排))

前言 介绍 插入排序 基本知识&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 直接插入…

oracle 数据库中,将几张表的数据按指定日期范围实时同步至同一个数据库的备份表中。

以下是一个Oracle数据库中实现表数据按指定日期范围实时同步至备份表的解决方案。这个方案使用存储过程和触发器组合实现&#xff1a; 1. 创建备份表结构 首先需要为每张需要备份的表创建对应的备份表&#xff0c;结构与原表相同&#xff1a; -- 为原表创建备份表&#xff08;示…

电脑网络连接正常,微信、QQ能正常使用,但无法访问网页?DNS问题的解决方案和背后原理。

文章目录1. 问题背景2. 解决方案2.1 手动刷新DNS2.1.1 Windows版本2.1.2 Mac版本2.2 手动设置DNS服务器2.2.1 Windows版2.2.2 Mac版2.3 其他解决方案3. DNS是什么&#xff1f;3.1 详细解释DNS3.1.1 A distributed, hierarchical database&#xff08;一个分布式和分层数据库结构…

【HTML】图片比例和外部div比例不一致,最大程度占满

图片比例和外部div比例不一致&#xff0c;最大程度占满&#xff0c;并且图片比例不变 其中1.jpg,2.jpg,1.html在同一目录 |-----|- 1.jpg|- 2.jpg|- 1.html1.jpg2.jpg<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /&g…

如何使用python网络爬虫批量获取公共资源数据技术

如何快速批量地获取海量公共资源数据决定了科研的效率。Python网络爬虫是快速批量获取网络数据的重要手段&#xff0c;它按照发送请求、获得页面、解析页面、下载内容、储存内容等流程&#xff1f; 一&#xff1a;Python软件的安装及入门1 Python软件安装及入门1)Anaconda软件安…

Kiro vs Cursor: AI IDE 终极对比指南

概述 随着生成式 AI 革命性地改变了我们编写代码的方式&#xff0c;新一代 AI 驱动的集成开发环境 (IDE) 正在崛起。Kiro 和 Cursor 代表了这一运动的前沿&#xff0c;但它们采用了截然不同的方法。 核心理念对比 特性AWS KiroCursor核心理念结构化开发流程 (Spec-driven)对…

Python获取网页乱码问题终极解决方案 | Python爬虫编码处理指南

在Python网络爬虫开发中&#xff0c;乱码是最常见的问题之一。本文将深入探讨乱码产生的原因&#xff0c;并提供多种有效的解决方案&#xff0c;帮助您彻底解决Python获取网页内容时的乱码问题。常见网页编码格式编码类型使用场景Python解码方式UTF-8现代网站标准编码.decode(u…

Android MTK平台预置多张静态壁纸

执行 adb shell pm list package -f wallpaper 命令&#xff0c;查看壁纸应用路径&#xff1a; /product/app/MtkWallpaperPicker/MtkWallpaperPicker.apkcom.android.wallpaperpicker 结果中带 Mtk 就可确定MTK有对应用进行重构。其源码路径在 vendor/mediatek/proprietary/…

基于Django的个人博客系统开发(开题报告)

毕业论文(设计)开题报告论文(设计)题目 基于Django的个人博客系统开发 1.选题目的和意义 随着云服务器的普及化以及编程培训机构大量涌现,学习网站开发技术以及编程技术,通过租用个人云服务器部署代码,构建个人博客网站,创建学习文档,记录学习过程,与他人交流技术学…

C++ 分配内存释放内存

C 分配内存释放内存一、new、delete、malloc和free最简单的分配内存自定义对象分配和释放内存二、new、delete与虚析构的问题三、一维、二维、多维数值创建和释放一维二维多维四、new的缺点以及连续内存的优点一、new、delete、malloc和free 最简单的分配内存 int* p_m (int*…

奥比中光深度相机开发

一、开发环境准备 1.1 硬件要求 奥比中光深度相机&#xff08;如Astra Pro、Gemini等&#xff09;USB 3.0接口&#xff08;确保数据传输稳定&#xff09;支持OpenGL的显卡&#xff08;可选&#xff0c;用于点云可视化&#xff09; 1.2 软件环境 SDK安装&#xff1a; 从奥比…

标题 “Python 网络爬虫 —— selenium库驱动浏览器

一、Selenium 库核心认知 Selenium 库是 Web 应用程序测试与自动化操作的利器 &#xff0c;能驱动浏览器&#xff08;如 Edge、Firefox 等&#xff09;执行点击、输入、打开、验证等操作 。与 Requests 库差异显著&#xff1a;Requests 库仅能获取网页原始代码&#xff0c;而 …

从实践出发--探究C/C++空类的大小,真的是1吗?

文章目录测试代码VS2022正常运行编译失败GCC总结Author: NemaleSu Data: 2025/07/21 测试环境&#xff1a; Win11&#xff1a;VS2022Ubuntu22.04&#xff1a;gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 相信众多cpper听过太多书籍、视频、文档、博客等资料&#xff0c;说C/C…

数据结构自学Day11-- 排序算法

一、排序算法的概念排序&#xff08;Sorting&#xff09;是指&#xff1a;将一组“无序”的数据&#xff0c;按照某种“顺序规则”排列成“有序”的过程。1、按排序顺序分类&#xff1a;升序&#xff1a;从小到大排列&#xff0c;如 1, 3, 5, 7, 9降序&#xff1a;从大到小排列…

电子元器件—三极管(一篇文章搞懂电路中的三极管)(笔记)(面试考试必备知识点)

三极管的定义及工作原理1. 定义三极管&#xff08;Transistor&#xff09;是一种具有三层半导体材料&#xff08;P-N-P 或 N-P-N&#xff09;构成的半导体器件&#xff0c;用于信号放大、开关控制和信号调制等应用。三极管有三个引脚&#xff1a;发射极&#xff08;Emitter&…

数据结构之克鲁斯卡尔算法

前言&#xff1a;和Prim算法一样&#xff0c;Kruskal 算法也是用来生成最小生成树的&#xff0c;这篇文章来学习一下Kruskal算法的实现 一、实现流程 初始化的时候&#xff0c;将所有的边用一个数组存储&#xff0c;并且按权值从小到大进行排序&#xff0c;每次选一个权值最小的…

MongoDB 查询时区问题

MongoDB默认时区是UTC&#xff0c;比北京时区晚八小时&#xff0c;北京时间UTC8h。 // 北京时间的 2024-10-01 08:00:00 // (>) 大于 - $gt // (<) 小于 - $lt // (>) 大于等于 - $gte // (< ) 小于等于 - $lte// Z代表UTC时区1、{"gmtCreate":{"$…

Windows VS2019 编译 Apache Thrift 0.15.0

随着微服务架构的普及,高效的跨语言远程过程调用(RPC) 成为了构建分布式系统的重要基础。Apache Thrift 是 Facebook 开源的一个轻量级、高性能的 RPC 框架,它允许开发者通过一个通用的接口定义语言(IDL)来定义服务接口和数据结构,并自动生成多种语言的客户端和服务端代…

搭建种草商城框架指南

一、引言在当今电商市场&#xff0c;种草商城以其独特的社交化购物模式受到越来越多用户的喜爱。搭建一个功能完善、体验良好的种草商城框架&#xff0c;需要综合考虑前端界面、后端服务、数据库设计等多个方面。本文将为你详细介绍搭建种草商城框架的关键要点和技术选型。二、…