恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

gRPC微服务搭建(学习阶段2:权限校验)

  • 首页
  • 资讯中心
  • /
  • gRPC微服务搭建(学习阶段2:权限校验)

相关资讯

物联网数据如何用Hadoop生态实现存储清洗与查询分析 2026/9/30 15:11:35
企业微服务架构演进方案:从单体拆分到容器化落地的完整路径 2026/9/30 15:11:35
StatefulSet与Deployment的选型对比:有状态应用的关键差异 2026/9/30 15:11:35

最新资讯

观澜研发型企业办公室租赁打分测评,在观澜找办公室找谁性价比高
vscode 扩展Cline、Continue的差别?TaoToken 统一 Key 接入实测对比
影刀RPA实操指南:定时任务配置详解——计划任务与触发器选择
深度评测——QiweAPI:重塑企业微信生态的底层增长引擎与TaoToken统一API通道实践
从 Prompt 到 Loop Engineering:用 TaoToken 统一 Key 搭建 AI 编程反馈系统
SpringBoot+Vue3图书商城系统实战:从开发到部署全流程解析

今日推荐

模型优化器实战:从FP32到INT8的推理加速与精度平衡
LangGraph+FastAPI构建可审计AI编码助手
基于图像预处理与几何特征的人脸脸型发型搭配系统实现

本周热门

从像素到笔画:srt-whiteboard-animation骨架笔迹追踪实现(Zhang-Suen细化+8邻接追踪)
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
新手入门看这篇:建设网站加盟避坑指南与SEO实操

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

gRPC微服务搭建(学习阶段2:权限校验)

发布时间:2026/9/30 15:11:35
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()})

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号