grpc auth interceptor+ Identifier Type设计模式+JWT验证

STM32H5 USB虚拟串口:用Classic驱动移植CDC实践 USB虚拟串口(CDC)是嵌入式系统最常用的主机通信方式之一,本质是借助USB协议模拟串口收发,无需额外驱动即可在PC上生成COM口。其实现依赖USB设备协议栈完成枚举、控制传输与批量传输。传统USBD Classic库不依赖RTOS,代码轻量、调用链短,非常适合裸机或轻量状态机架构;而USBX功能强大但需要ThreadX内核,资源开销较大。在电机控制器、传感器采集等场景中,日志输出与参数配置仅需简单的双向数据通道,Classic驱动往往更务实。本文基于STM32H5平台,详细梳理了使用Classic驱动移 阅读详情

1、自定义 grpc interceptor

因UnaryServerInterceptor 实为函数类型,因此只实现此函数即可。

// UnaryServerInterceptor provides a hook to intercept the execution of a unary RPC on the server. info
// contains all the information of this RPC the interceptor can operate on. And handler is the wrapper
// of the service method implementation. It is the responsibility of the interceptor to invoke handler
// to complete the RPC.
type UnaryServerInterceptor func(ctx context.Context, req interface{}, info *UnaryServerInfo, handler UnaryHandler) (resp interface{}, err error)
const (
	authorizationHeader = "authorization"
	bearerPrefix        = "Bearer "
)

//Interceptor creates a grpc auth interceptor.
func Interceptor(publicKeyFile string) (grpc.UnaryServerInterceptor, error) {
	f, err := os.Open(publicKeyFile)
	if err != nil {
		return nil, fmt.Errorf("cannot open public key file: %v", err)
	}
	b, err := ioutil.ReadAll(f)
	if err != nil {
		return nil, fmt.Errorf("cannot read public key file:%v", err)
	}
	pubKey, err := jwt.ParseRSAPublicKeyFromPEM(b)
	if err != nil {
		return nil, fmt.Errorf("cannot parse public key: %v", err)
	}

	i := &interceptor{
		publicKey: pubKey,
		verifier: &token.JWTTokenVerifier{
			PublicKey: pubKey,
		},
	}
	return i.HandleReq, nil
}

// 设计为不与jwt绑定
type tokenVerifier interface {
	Verify(token string) (string, error)
}

//自定义拦截器
type interceptor struct {
	publicKey *rsa.PublicKey //公钥
	verifier  tokenVerifier // Token验证器
}

func (i *interceptor) HandleReq(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
	tkn, err := tokenFromContext(ctx)
	if err != nil {
		return nil, status.Error(codes.Unauthenticated, "")
	}

	aid, err := i.verifier.Verify(tkn)
	if err != nil {
		return nil, status.Errorf(codes.Unauthenticated, "token not valid: %v", err)
	}
	return handler(ContextWithAccountID(ctx, AccountID(aid)), req)
}

func tokenFromContext(ctx context.Context) (string, error) {
	unauthenticated := status.Error(codes.Unauthenticated, "")
	m, ok := metadata.FromIncomingContext(ctx)
	if !ok {
		return "", unauthenticated
	}

	tkn := ""
	for _, v := range m[authorizationHeader] {
		if strings.HasPrefix(v, bearerPrefix) {
			tkn = v[len(bearerPrefix):]
		}
	}
	if tkn == "" {
		return "", unauthenticated
	}

	return tkn, nil
}

type accountIDKey struct{}

// AccountID defines account id object.
type AccountID string

func (a AccountID) String() string {
	return string(a)
}

// ContextWithAccountID creates a context with given account id.
func ContextWithAccountID(c context.Context, aid AccountID) context.Context {
	return context.WithValue(c, accountIDKey{}, aid)
}

// AccountIDFromContext gets account id from context.
// Returns unauthenticated error if no account id is available.
func AccountIDFromContext(c context.Context) (AccountID, error) {
	v := c.Value((accountIDKey{}))
	aid, ok := v.(AccountID)
	if !ok {
		return "", status.Error(codes.Unauthenticated, "")
	}
	return aid, nil
}

2、通用GRPC Server注册方法

//GRPCConfig defines a grpc server
type GRPCConfig struct {
	Name              string
	Addr              string
	AuthPublicKeyFile string
	RegisterFunc      func(*grpc.Server)
	Logger            *zap.Logger
}

// RunGRPCServer runs a grpc server
func RunGRPCServer(c *GRPCConfig) error {
	nameField := zap.String("name", c.Name)
	lis, err := net.Listen("tcp", c.Addr)
	if err != nil {
		c.Logger.Fatal("cannot listen", nameField, zap.Error(err))
	}

	var opts []grpc.ServerOption
	if c.AuthPublicKeyFile != "" {
		in, err := auth.Interceptor(c.AuthPublicKeyFile)
		if err != nil {
			c.Logger.Fatal("cannot create auth interceptor", nameField, zap.Error(err))
		}
		opts = append(opts, grpc.UnaryInterceptor(in))
	}

	s := grpc.NewServer(opts...)
	c.RegisterFunc(s)

	c.Logger.Info("server started", nameField, zap.String("addr", c.Addr))
	return s.Serve(lis)

}

3、简单使用

	logger.Sugar().Fatal(server.RunGRPCServer(&server.GRPCConfig{
		Name:   "auth",
		Addr:   ":8081",
		Logger: logger,
		RegisterFunc: func(s *grpc.Server) {
			authpb.RegisterAuthServiceServer(s, &auth.Service{
				OpenIDResolver: &wechat.Service{
					AppID:     "your app id",
					AppSecret: "your app secret",
				},
				Mongo:          dao.NewMongo(mongoClient.Database("coolcar")),
				Logger:         logger,
				TokenExpire:    10 * time.Second,
				TokenGenerator: token.NewJWTTokenGen("coolcar/auth", privKey),
			})

		},
	}))

 

上海计算机学会2020年5月月赛C++乙组T2经济普查 中国正在以前所未有的力度推进脱贫攻坚,国家计划在2020年使得在现行标准下的贫困人口实现全面脱贫,为此,需要对居民的经济状况进行普查。 题目描述 给定一个正整数n,表示人口数量。一开始,每个居民拥有的财产记为a1​,a2​,⋯,an​,财产可能发生两种变化: 一种来源于个体,由某个居民的经济活动而产生。在某个时刻,某个居民的财产会直接变成某个数值,可能升高也可能降低。 一种来源于政策,在某个时刻,国家会对财产低于某个标准线全部的居民,实施政策支持,使得他们的财产全部正好到达标准线。 给定这些变 阅读详情

相关推荐

Synopsys PCIe IP 实战笔记:手把手教你配置本地数字回环(PIPE/RMMI)

本文详细介绍了Synopsys PCIe IP本地数字回环(PIPE/RMMI)的配置与调试全流程,涵盖硬件连接、寄存器操作及实战技巧。通过数字回环模式,开发者可在无真实对端设备的情况下验证PCIe接口功能,适用于芯片验证和FPGA原型开发。文章还提供了常见问题排查和性能优化建议,助力高效完成协议解析与调试。

weixin_30394669的博客 322

Springboot中拦截器Interceptor的实现和应用

一、拦截器介绍 拦截器(Interceptor)依赖 Spring的WEB框架,在SpringMVC框架中是配置在SpringMVC的配置文件中,在SpringBoot项目中也可以采用注解的形式实现。 拦截器是 AOP 的一种应用,底层采用 Java 的反射机制来实现的。与过滤器一个很大的区别是在拦截器中可以注入 Spring 的 Bean,能够获取到各种需要的 Service 来处理业务逻辑,而过滤器则不行,这里我们只讲一下SpringBoot中拦截器的实现和应用。 二...

sayoko06的博客 4779

Android13系统设置第三方app为设备所有者

DevicePolicyManagerService.java文件所在目录是frameworks/base,记得将包类名换成自己app的。2. 将拷贝到系统分区下的两个xml文件继续通过init.rc服务拷贝到data/system/目录下并修改权限。1. 拷贝设备所有者和设备管理器两个对应的xml文件到系统分区。

wzh048503的博客 2502

springmvc 拦截器实现

拦截器说明 自定义的拦截器AuthInterceptor实现HandlerInterceptor接口 执行顺序: 1、preHandle: 进入方法之前被执行 //登录拦截,权限校验等等 //true表示通行 false表示拦截 2、postHandle: 方法执行之后,返回ModelAndView之前被执行 //设置页面公用参数操作 3、afterCompletion:方法执行后被执行...

神韵 396

金智维KRPA实战:Excel自动化数据处理全流程解析

本文详细解析了金智维KRPA在Excel自动化数据处理中的全流程应用,涵盖COM接口和文件读写两种核心技术方案,以及销售报表生成、数据清洗和可视化仪表盘等实战案例。通过企业级应用的异常处理、性能优化和安全合规实践,显著提升数据处理效率和准确性,助力企业降本增效。

weixin_30329623的博客 598

Wider Face+YOLOV7人脸检测

使用Wider Face数据集训练YOLOV7

chen_znn的博客 8406

使用自定义注解和拦截器实现角色验证的权限控制

通过使用自定义注解和拦截器,我们可以在Spring应用程序中实现灵活的角色验证的权限控制。通过在方法上标记注解,我们可以精确地控制哪些方法需要进行权限验证,哪些方法不需要进行权限验证。在现代的Web应用程序中,权限控制是一项重要的安全功能。通过对用户角色进行验证,我们可以限制用户对敏感资源的访问。方法中,您可以根据实际需求实现根据用户角色判断是否允许访问的逻辑。注解,如果标记了,则不进行权限验证,直接放行。,用于标记不需要进行权限验证的方法。,通过在方法上标记注解来控制是否需要进行权限验证。

diligent_man_z的博客 761

Xilnx大学计划/XUP ZYNQ ZU开发板

TUL PYNQ™-ZU板,基于Xilinx Zynq UltraScale+ MPSoC,是为Xilinx大学项目设计的,以支持Xilinx PYNQ (Python Productivi-ty for Zynq)开源框架和嵌入式系统开发。

weixin_57025922的博客 946

SpringMVC拦截器Interceptor

一、Interceptor定义 SpringMVC拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似与servlet中的Filter。 SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor来实现的。 在SpringMVC中定义一个Interceptor非常简单,主要有4种方式: 1)实现Spring的HandlerInte...

希望我的博客,能解决你工作中的问题 1186

大语言模型原理与工程实践:手把手教你训练 7B 大语言模型 自动化训练框架

近年来,大语言模型(Large Language Models,LLMs)在自然语言处理领域取得了突破性进展。从GPT-3到ChatGPT,再到最新的GPT-4,这些模型展现出了惊人的语言理解和生成能力,引发了学术界和产业界的广泛关注。然而,训练如此庞大的模型不仅需要海量的数据和计算资源,还需要复杂的工程实践和优化技巧。本文将深入探讨大语言模型的原理,并以7B参数规模的模型为例,详细介绍如何构建一个自动化训练框架,使读者能够亲自动手训练自己的大语言模型。

AI天才研究院 1920

【WRF-GHG 教程上】完整教程(2024年更新版)

完整教程(2024年更新版)

WW、forever的博客 1432

SpringBoot2.* 配置拦截器(Interceptor) 并 集成swagger2 3.0版本

SpringBoot 拦截器 swagger2 V3

weixin_39527642的博客 1862

MoveIt 运动学、运动规划、混合规划、move_group

混合规划是运动规划方法的一个术语,它将异构运动规划器结合起来,以产生更稳健或反应更快的解决方案。这种通用方法在导航领域已经非常成熟,并在导航2等流行项目中成功实施。MoveIt 的混合规划架构结合了一对全局规划器和局部规划器,它们以不同的规划速度和问题范围并行、并发运行。全局规划器的任务是解决全局运动规划问题,这与 “感知-规划-行动 ”应用中使用的规划器非常相似。所使用的规划器算法应该是完整的,因此假定其计算时间相对较慢。此外,全局规划器不要求实时安全,这意味着无法保证规划器在特定期限内找到解决方案。

机器人控制与仿真应用 2131

单点登录(基于注解方式的拦截器)

目录 一、用户直接点击登录功能登录 1、访问首页 2、点击“你好,请登录”跳转到登录页面 3、点击登录按钮 二、结算时被登录功能拦截 1、点击去结算 2、拦截器拦截,并跳转到登陆页面 3、拦截器 (1)AuthInterceptor (2)WebMvcConfiguration (3)LoginRequired (4)CookieUtil (5)JwtUtil (6)H...

qq_38151401的博客 1983

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring开发系列教程(23)——使用Interceptor

上图虚线框就是Filter2的拦截范围,Filter组件实际上并不知道后续内部处理是通过Spring MVC提供的还是其他Servlet组件,因为Filter是Servlet规范定义的标准组件,它可以应用在任何基于Servlet的程序中。如果只基于Spring MVC开发应用程序,还可以使用Spring MVC提供的一种功能类似Filter的拦截器:Interceptor。所以,Interceptor的拦截范围其实就是Controller方法,它实际上就相当于基于AOP的方法拦截。

彩蛋在每篇文章的最后名片 1169

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

掌握Web组件(二):使用拦截器(Interceptor)实现认证与授权

本文介绍了Spring MVC中拦截器(HandlerInterceptor)的作用及优势。与Servlet过滤器(Filter)相比,拦截器能感知Spring MVC内部机制,可精确控制请求处理流程。文章通过对比两者的执行时机、上下文感知和控制粒度,说明拦截器更适合实现细粒度的认证授权逻辑。实战部分演示了如何创建Token认证拦截器,并通过WebMvcConfigurer配置类注册拦截路径。拦截器的preHandle方法可获取请求头信息进行验证,认证失败时返回401错误,成功则放行请求。这种机制为构建灵活

杨小扩的博客 1140

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java中Filter过滤器Interceptor拦截器的比较和登录验证入门案例

过滤器(Filter)和拦截器(Interceptor)的比较以及入门案例和简单的登录验证案例.

Java_sqcs的博客 977

springboot拦截器 跳过_SpringBoot中自定义拦截器详解 (Token校验与放行)

首先是拦截类AuthInterceptor.java中的具体逻辑,主要是有继承BaseInterceptor.java 类,而这个BaseInterceptor.java类继承了HandlerInterceptorAdapter类,然后拦截类AuthInterceptor.java实现了其中的preHandle方法以下是全部代码拦截器主要逻辑类——AuthInterceptor.javapacka...

weixin_34270007的博客 2861

gRPC 进阶——利用 Metadata 和 Interceptor 实现 auth 认证

gRPC 是一个高性能的开源 RPC 框架,支持多种编程语言,并且基于 HTTP/2 协议提供了双向流和头部压缩等特性。在构建分布式系统和微服务架构时,安全认证是至关重要的一环。通过利用 gRPC 的 Metadata 和拦截器机制,可以实现灵活且强大的认证解决方案。

MPY_3的博客 738

JWT解密Token报错解决

JWT SignatureException

李家小二 4617

Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南

优先使用拦截器处理Web层通用逻辑保留过滤器用于底层请求处理复杂场景可以组合使用两者生产环境务必进行性能压测通过合理运用过滤器和拦截器,开发者可以构建出高可维护性的Web应用架构。建议结合APM工具(如SkyWalking)监控两者的执行效率,持续优化系统性能。

A_Kamen的博客 1267

Spring Boot 拦截器(Interceptor)详解:用法与实现原理

SpringBoot拦截器是处理Web请求的组件,用于在请求前后执行特定逻辑,如日志、权限校验等。核心接口HandlerInterceptor包含三个方法:preHandle(请求前)、postHandle(请求处理后)、afterCompletion(请求完成)。实现步骤包括创建拦截器类并注册配置拦截路径。典型应用场景包括日志记录、权限校验、性能监控等。拦截器与过滤器的区别在于拦截器属于SpringMVC、可访问SpringBean,而过滤器属于Servlet规范。使用需注意线程安全、异常处理和性能优化。

weixin_74416579的博客 1990

基于 Spring 的自定义注解和请求拦截器实现认证机制

基于 Spring 的自定义注解和请求拦截器实现认证机制

李长渊的博客 1394

angular get请求报错401,From Auth Intercept

摘要 在使用ng Alain开发时遇到401错误,浏览器直接请求接口正常但Angular请求失败。经排查发现是HttpClient模块配置问题。虽然已在app.module.ts中正确导入HttpClientModule,但因项目存在二级module.ts文件,还需在对应的xxx.module.ts中重复相同的HttpClientModule导入配置。完成该配置后,HTTP请求恢复正常。这表明在多模块结构中,每个需要HTTP服务的模块都必须单独导入HttpClientModule。

城南蝈蝈 842

【gRPC】3—gRPC API设计详解

gRPC整体设计思路依附于HTTP/2协议,而HTTP/2是一个双向流协议,因此gRPC在API设计上也采用了Stream的方式

一棵灬大树的博客 1423

grpc 4种模式介绍及java代码示例

grpc 是 Google 开发的一种开源 RPC(Remote Procedure Call Protocol 远程过程调用的协议)框架,在 gRPC 中,客户端应用程序可以像本地对象一样直接调用不同机器上的服务器应用程序上的方法,从而使您可以更轻松地创建分布式应用程序和服务。客户端数据流模式:也称客户端流式 RPC,与服务端数据流模式相反,客户端持续向服务端发送数据流,在发送结束后,由服务端返回一个响应。服务端数据流模式:也称服务端流式 RPC,即客户端发起一次请求,服务端可以连续返回数据流。

z69183787的专栏 1266
上一篇: K8s架构概览
下一篇: Redis 知识框架
DreamCatcher
博客等级 码龄20年 23粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamCatcher

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值