gRPC微服务搭建(学习阶段2:权限校验)
在gRPC的权限校验中写一个类然后继承grpc.ServerInterceptor即可使用权限校验每隔函数在调用前都会调用这个函数这个函数可用于权限校验或是一些数据准备等操作。文章目录权限校验示例程序服务端代码客户端代码带Login的权限管理服务端代码客户端代码权限校验示例程序服务端代码importjsonfromconcurrentimportfuturesimportgrpc# 业务函数收到客户端请求后返回问候消息。defsay_hello(request,_context):return{message:fHello,{request[name]}!}# 拦截器是 gRPC 的固定扩展写法可以在请求到达业务函数前做日志、鉴权等处理。# 这里为了保持简单只打印请求方法不做真正的权限校验。classLogInterceptor(grpc.ServerInterceptor):defintercept_service(self,next_step,handler_call_details):print(f收到请求{handler_call_details.method})returnnext_step(handler_call_details)defserver(envdev,address[::]:50051,max_workers2):启动 gRPC 服务。 env运行环境名称当前只用于打印提示。 address监听地址格式通常是“主机:端口”。 max_workers线程池中的最大工作线程数。 print(f当前运行环境{env})# 这是 gRPC 创建服务端的固定写法。grpc_servergrpc.server(futures.ThreadPoolExecutor(max_workersmax_workers),interceptors[LogInterceptor()])# 下面是本示例的 JSON 请求处理器。# 标准 gRPC 项目通常会用 .proto 文件自动生成这部分代码。handlergrpc.unary_unary_rpc_method_handler(say_hello,request_deserializerlambdadata:json.loads(data.decode(utf-8)),response_serializerlambdaresponse:json.dumps(response).encode(utf-8),)# 注册服务和方法这是手动注册 RPC 方法的写法。grpc_server.add_generic_rpc_handlers((grpc.method_handlers_generic_handler(hello.Greeter,{SayHello:handler}),))# 添加监听端口、启动服务、持续等待是 gRPC 服务启动的固定流程。grpc_server.add_insecure_port(address)grpc_server.start()print(fgRPC 服务已启动监听地址{address})grpc_server.wait_for_termination()# 程序从这里开始执行调用 server() 启动服务。if__name____main__:server()客户端代码importjsonimportgrpc# 连接地址必须和 server.py 中的端口一致。withgrpc.insecure_channel(127.0.0.1:50051)aschannel:# 指定要调用的服务方法/服务名/方法名。say_hellochannel.unary_unary(/hello.Greeter/SayHello,# 发送请求前Python 字典转换为 JSON 字节。request_serializerlambdadata:json.dumps(data).encode(utf-8),# 收到响应后JSON 字节转换为 Python 字典。response_deserializerlambdadata:json.loads(data.decode(utf-8)),)# 发送名称并获取服务端返回的问候消息。responsesay_hello({name:World})print(response[message])带Login的权限管理使用带login的权限管理核心在于AuthInterceptor这个类中当method /auth.Auth/Login时直接执行校验当执行其他的method的时候直接替换调用check_token这个函数校验token如果可以就通过handler.unary_unary(request, context)继续执行如果不行就通过context.abort(grpc.StatusCode.UNAUTHENTICATED, 请先登录)直接返回不进行后续的执行服务端代码importjsonfromconcurrentimportfuturesimportgrpc# 服务端保存登录成功后的 Token。TOKENNone# 登录接口不需要 Token登录成功后生成并保存 Token。deflogin(request,_context):globalTOKENifrequest[username]!adminorrequest[password]!123456:return{success:False,message:用户名或密码错误}TOKENtoken-123return{success:True,token:TOKEN,message:登录成功}# 只有通过 Token 校验后才会执行这个业务函数。defsay_hello(request,_context):return{message:fHello,{request[name]}!}# 将普通 Python 函数注册成 gRPC 方法并处理 JSON 转换。defjson_handler(function):returngrpc.unary_unary_rpc_method_handler(function,request_deserializerlambdadata:json.loads(data.decode(utf-8)),response_serializerlambdadata:json.dumps(data).encode(utf-8),)# 在业务函数执行前检查 Token。classAuthInterceptor(grpc.ServerInterceptor):defintercept_service(self,continuation,handler_call_details):methodhandler_call_details.method handlercontinuation(handler_call_details)ifhandlerisNone:returnNone# 登录接口不能检查 Token否则客户端无法登录。ifmethod/auth.Auth/Login:returnhandler# 其他接口都必须携带正确的 Token。defcheck_token(request,context):ifrequest.get(token)!TOKEN:context.abort(grpc.StatusCode.UNAUTHENTICATED,请先登录)returnhandler.unary_unary(request,context)# Token 正确继续执行原来的业务函数# 用权限检查函数替换原来的业务处理函数。returnhandler._replace(unary_unarycheck_token)defserver(address[::]:50051,max_workers2):启动 gRPC 服务。# 创建服务并安装 AuthInterceptor 权限拦截器grpc_servergrpc.server(futures.ThreadPoolExecutor(max_workersmax_workers),interceptors[AuthInterceptor()])# 注册登录接口grpc_server.add_generic_rpc_handlers((grpc.method_handlers_generic_handler(auth.Auth,{Login:json_handler(login)},),# 注册需要登录的问候接口。grpc.method_handlers_generic_handler(hello.Greeter,{SayHello:json_handler(say_hello)},),))grpc_server.add_insecure_port(address)grpc_server.start()print(fgRPC 服务已启动监听地址{address})grpc_server.wait_for_termination()if__name____main__:server()客户端代码importjsonimportgrpc# 连接地址必须和 server.py 中的端口一致。withgrpc.insecure_channel(127.0.0.1:50051)aschannel:# 第一步调用登录接口获取服务端保存的 Token。loginchannel.unary_unary(/auth.Auth/Login,request_serializerlambdadata:json.dumps(data).encode(utf-8),response_deserializerlambdadata:json.loads(data.decode(utf-8)),)login_resultlogin({username:admin,password:123456})print(login_result[message])# 第二步调用需要登录的 SayHello 接口。say_hellochannel.unary_unary(/hello.Greeter/SayHello,request_serializerlambdadata:json.dumps(data).encode(utf-8),response_deserializerlambdadata:json.loads(data.decode(utf-8)),)# 登录成功后把 Token 和名称一起发送给服务端。responsesay_hello({name:World,token:login_result[token]})print(response[message])# 第三步不发送 Token模拟未登录调用。try:say_hello({name:World})exceptgrpc.RpcErroraserror:print(f未登录{error.details()})

相关新闻

物联网数据如何用Hadoop生态实现存储清洗与查询分析

物联网数据如何用Hadoop生态实现存储清洗与查询分析

物联网数据这几年我经手了不少,从车联网终端上报的轨迹点,到厂房里各种PLC传感器采集的温度、振动、能耗数据,说白了就是一个字:多。设备一多、频率一高,一天少说几千万条记录,传统的关系型数据库根本扛不住…

2026/9/30 15:11:19 阅读更多 →
2300款PS插件合集深度拆解:DR5磨皮、2.5D插画与效率工具实战

2300款PS插件合集深度拆解:DR5磨皮、2.5D插画与效率工具实战

1. 内容整体设计与思路拆解 1.1 为什么你手里那一堆插件永远“装不上、用不了、找不到” 做设计这行久了,你会发现一个规律:真正拉开工作效率差距的,往往不是PS操作熟练度,而是你手边有没有一套趁手的插件。同样一张人像&#xf…

2026/9/30 15:10:18 阅读更多 →
OTN G.709标准帧结构、映射与FEC排障实战指南

OTN G.709标准帧结构、映射与FEC排障实战指南

简介:围绕ITU-T G.709与OTN技术的中文资料面向光通信、传输网规划与维护人员,也适合需要了解OTN帧结构、映射与维护机制的初学者。内容先梳理OTN分层结构,从光信道层、光复用段层、光传输层,再到OPUk、ODUk、OTUk三层电域结构&…

2026/9/30 15:10:18 阅读更多 →

最新新闻

基于Keras的图像超分辨率Web对比系统实操指南

基于Keras的图像超分辨率Web对比系统实操指南

做图像超分辨率这几年,我一直有个很实际的困惑:模型训练了、指标跑出来了,但要给别人展示效果时,要么发一堆图片文件让人来回切着看,要么在本地脚本里用 matplotlib 糊一屏图,既不直观也没法对比细节。后来…

2026/9/30 15:51:16 阅读更多 →
MindSpore数据管线实战:大模型训练预处理与调优

MindSpore数据管线实战:大模型训练预处理与调优

做了一段时间大模型训练,我最大的感受是:模型结构、优化器、学习率调度这些坑,大多数都能在网上找到成熟经验,反而是数据处理这块,出了问题非常隐蔽,排查起来也最头疼。很多时候模型收敛慢、loss震荡、显存…

2026/9/30 15:51:16 阅读更多 →
Altium Designer实战避坑:从库管理到PCB出图全流程

Altium Designer实战避坑:从库管理到PCB出图全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 15:51:16 阅读更多 →
软件版本管理规范:版本号、分支、制品与发布台账

软件版本管理规范:版本号、分支、制品与发布台账

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 15:51:16 阅读更多 →
dgnet.dll丢失怎么办?官方修复流程与单文件下载风险详解

dgnet.dll丢失怎么办?官方修复流程与单文件下载风险详解

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

2026/9/30 15:51:16 阅读更多 →
TensorFlow工程本质:从安装到生产部署的系统级解析

TensorFlow工程本质:从安装到生产部署的系统级解析

1. 这不是“又一个深度学习框架”:TensorFlow的真实定位与误读陷阱很多人第一次听说TensorFlow,是在某篇“AI入门指南”里看到它和PyTorch并列排在“主流框架”名单上;也有人是在公司技术选型会上,听到架构师说“我们用TensorFlow…

2026/9/30 15:50:08 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/30 15:27:04 阅读更多 →