本章代码已提交至Gitee: https://gitee.com/lengcz/distributed-security01.git文章目录网关创建网关安全配置网关网关整合OAuth2.0 有两种思路一种是认证服务器生成jwt令牌所有请求统一在网关层验证判断权限等操作另一种是由各资源服务器处理网关只做请求转发。这里选择第一种我们把API网关作为OAuth2.0的资源服务器角色实现接入客户端权限拦截和令牌解析并转发当前登录用户信息jsonToken)给微服务这样下游微服务就不需要关心令牌格式解析以及OAuth2.0相关机制了。API网关在认证授权体系里主要负责两件事1作为OAuth2.0的资源服务器角色实现接入方权限拦截2令牌解析并转发当前登录用户信息明文token)给微服务微服务拿到明文token(明文token中包含登录用户的身份和权限信息后也需要做两件事用户授权拦截看当前用户是否有权限访问该资源将用户信息存储金当前线程上下文有利于后续业务逻辑随时获取当前用户信息创建网关创建网关 distributed-security-gatewaypom.xml?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIddistributed-security/artifactIdgroupIdcom.it2.security/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIddistributed-security-gateway/artifactIddependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-hystrix/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-ribbon/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependencydependencygroupIdcom.netflix.hystrix/groupIdartifactIdhystrix-javanica/artifactId/dependencydependencygroupIdorg.springframework.retry/groupIdartifactIdspring-retry/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-zuul/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-security/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-oauth2/artifactId/dependencydependencygroupIdorg.springframework.security/groupIdartifactIdspring-security-jwt/artifactId/dependencydependencygroupIdjavax.interceptor/groupIdartifactIdjavax.interceptor-api/artifactId/dependencydependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency/dependencies/projectapplication.propertiesspring.application.namegateway-server server.port53010 spring.main.allow-bean-definition-overriding true logging.level.root info logging.level.org.springframework info zuul.retryable true zuul.ignoredServices * zuul.add-host-header true zuul.sensitiveHeaders * zuul.routes.uaa-service.stripPrefix false zuul.routes.uaa-service.path /uaa/** zuul.routes.order-service.stripPrefix false zuul.routes.order-service.path /order/** eureka.client.serviceUrl.defaultZone http://localhost:53000/eureka/ eureka.instance.preferIpAddress true eureka.instance.instance-id ${spring.application.name}:${server.port} management.endpoints.web.exposure.include refresh,health,info,env feign.hystrix.enabled true feign.compression.request.enabled true feign.compression.request.mime-types[0] text/xml feign.compression.request.mime-types[1] application/xml feign.compression.request.mime-types[2] application/json feign.compression.request.min-request-size 2048 feign.compression.response.enabled true feign.httpclient.connection-timeout10000启动类importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;importorg.springframework.cloud.netflix.zuul.EnableZuulProxy;SpringBootApplicationEnableZuulProxy//网关zuul代理EnableDiscoveryClient//需要从注册中心拿地址publicclassGatewayServer{publicstaticvoidmain(String[]args){SpringApplication.run(GatewayServer.class,args);}}统一认证服务UAA与统一用户服务都是网关下微服务需要在网关下新增路由配置zuul.routes.uaa-service.stripPrefix false zuul.routes.uaa-service.path /uaa/** zuul.routes.order-service.stripPrefix false zuul.routes.order-service.path /order/**配置ResourceServerConfigpackagecom.it2.security.distributed.gateway.config;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.config.http.SessionCreationPolicy;importorg.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;importorg.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;importorg.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;importorg.springframework.security.oauth2.provider.token.TokenStore;ConfigurationpublicclassResourceServerConfig{publicstaticfinalStringRESOURCE_IDres1;AutowiredprivateTokenStoretokenStore;//uaa资源服务配置ConfigurationEnableResourceServerpublicclassUAAServerConfigextendsResourceServerConfigurerAdapter{AutowiredprivateTokenStoretokenStore;Overridepublicvoidconfigure(ResourceServerSecurityConfigurerresources)throwsException{resources.resourceId(RESOURCE_ID)//资源id.tokenStore(tokenStore)//自己验证令牌// .tokenServices(tokenService()) //验证令牌的服务.stateless(true);}Overridepublicvoidconfigure(HttpSecurityhttp)throwsException{http.authorizeRequests().antMatchers(/uaa/**).permitAll();}}//uaa资源服务配置ConfigurationEnableResourceServerpublicclassOrderServerConfigextendsResourceServerConfigurerAdapter{AutowiredprivateTokenStoretokenStore;Overridepublicvoidconfigure(ResourceServerSecurityConfigurerresources)throwsException{resources.resourceId(RESOURCE_ID)//资源id.tokenStore(tokenStore)//自己验证令牌// .tokenServices(tokenService()) //验证令牌的服务.stateless(true);}Overridepublicvoidconfigure(HttpSecurityhttp)throwsException{http.authorizeRequests().antMatchers(/order/**).access(#oauth2.hasScope(ROLE_API));}}//配置其他资源服务}上面定义了两个微服务的资源其中UAAServerConfig指定了若请求匹配/uaa/网关不进行拦截。OrderServerConfig指定了若请求匹配/order/也就是访问统一用户服务接入客户端需要有scope中包含read并且authorities权限中需要包含ROLE_USER由于res1这个接入客户端read包括ROLE_ADMINROLE_USERROLE_API三个权限。安全配置这个资源服务同样也需要接入安全配置。importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;ConfigurationpublicclassWebSecurityConfigextendsWebSecurityConfigurerAdapter{//配置安全拦截机制protectedvoidconfigure(HttpSecurityhttp)throwsException{http.authorizeRequests().antMatchers(/**).permitAll().and().csrf().disable();}}
Windows下Obsidian多版本共存实战:mklink+AppData精细化管理 1. 为什么需要在一台电脑上装多个 Obsidian 版本?这真不是折腾,而是刚需Obsidian 不是普通软件,它本质是一个本地优先的知识操作系统。你用它写笔记、搭知识库、做项目管理、甚至当轻量级 IDE,不同场景对版本的要求天差地别。我见…
python interpreter 装不上Python?这翻译官卡死90%新手,真让人心碎 好些想要学习编程的友人, 满怀信心地开启教程, 然而, 第一步便遭遇阻碍——无法成功安装。不是出现报错了, 就是寻觅不到入口, 要不然就是面对着一排安装包, 两眼一抹黑。明明教程里面, 老师点几下就能够搞定, 然而到自己手上, 却怎么弄都不正确。说实话, 这一关把人劝退的数量…
2026年7月最新苏州泰格豪雅官方售后热线及客户服务网点地址 - 亨得利官方服务中心 2026年7月,苏州泰格豪雅官方售后服务体系全面完成升级,为本地及全国腕表用户提供更高效、更透明的客户服务。本文将依据2026年7月最新苏州泰格豪雅官方售后热线及客户服务网点地址,系统梳理官方售后渠道、服务项目、…
SM320C6748-HIREL DSP硬件设计:电源、时钟与引脚配置实战指南 1. 项目概述与核心挑战在嵌入式硬件设计领域,尤其是面对德州仪器(TI)SM320C6748-HIREL这类高性能、高可靠性数字信号处理器时,工程师们常常会陷入一种“数据手册依赖症”。手册里密密麻麻的表格、参数和注意事项,看似详…
捷联惯导系统(SINS)机械编排:从微分方程到离散算法的工程实现 1. 捷联惯导系统基础概念想象一下你正在玩一款VR游戏,头戴设备需要实时感知你的头部转动和身体移动——这背后就是捷联惯导系统(SINS)在发挥作用。与传统平台式惯导不同,SINS直接把陀螺仪和加速度计"粘"在载体上,就像把手机传感器固…
AI让产品构建成本趋近于零后,独立开发者该如何构建可持续的分发资产? 在AI工具把原型开发和迭代成本压到极低的2026年,你可能已经亲身经历过这样的场景:用Cursor或Claude几小时就能把一个mini-SaaS从0做到可演示版本,功能完整、体验还不错。但真正卡住的从来不是“能不能做出来”,而是“最初的1000个…
简单使用 SQLite-元一软件 创建 SQLite 数据库 打开 SQLiteStudio 软件,点击菜单“Database”,选择“Add a database”菜单项,如下图:在数据库弹窗中,数据类型选择“SQLite 3”,点击“”按钮创建一个 db 数据库文件,这里笔…
从逻辑到架构:基于工资支付系统案例的DFD与SC映射实战 1. 工资支付系统的现实困境与需求分析每次月底看到财务科的同事加班到深夜,手工计算全校教职工的工资明细,我就忍不住思考:这种低效的工作方式真的无法改变吗?某职业高中的财务科长向我吐槽,现在每月需要两名会计连续工…
数据挖掘-从Apriori到FP-Growth:算法演进与性能对比 1. 关联规则挖掘的进化之路想象你是一家超市的经理,想要知道哪些商品经常被顾客一起购买。比如买了啤酒的顾客往往也会买尿布,这就是经典的"啤酒与尿布"关联规则。20世纪90年代,Apriori算法是解决这类问题的首选工具,但…
Python ctypes性能优化实战:8大技巧突破C扩展速度瓶颈 1. 项目概述:当Python遇上C,速度瓶颈的破局之道“Python调用C太慢?”——这恐怕是很多在性能敏感场景下使用Python的开发者,尤其是那些尝试过用ctypes、CFFI或Cython来集成C/C代码的朋友,心中挥之不去的疑问。你兴冲冲…
2026 年宜春诚信的塑料缠绕膜厂家哪个好,缠绕膜背后的秘密:你不知道的成本陷阱 - 领域鉴赏官 缠绕膜的秘密是什么,其中的成本陷阱又是怎样的一种情况呢在我们日常生活中的生产、仓储、运输等行业里经常要使用到塑料缠绕膜。你经营的是一个小小的电子产品制造公司,每天有无数电子产品的出货要装箱发货。你依旧用…
TPS2551-Q1负载开关:汽车电子电源路径保护与智能管理实战 1. 项目概述与核心价值在车载电子、便携设备乃至工业控制系统的电源路径设计中,我们工程师最头疼的问题之一,就是如何优雅且可靠地处理“意外”。你精心设计的5V电源轨,可能因为一个劣质USB设备的插入、一根内部短路的线缆,或者仅…
PlantUML 实战:5分钟将 UML 2.5 序列图转换为可执行代码草图 PlantUML 实战:5分钟将 UML 2.5 序列图转换为可执行代码草图 在软件开发过程中,清晰的系统设计往往比编码本身更为关键。传统拖拽式UML工具虽然直观,却常常成为效率杀手——频繁的鼠标操作打断设计思路,版本控制困难,…
【RT-DETR涨点改进】29 动态Batch推理:让RT-DETR在低延迟下吃满GPU算力 29 动态Batch推理:让RT-DETR在低延迟下吃满GPU算力 开篇故事 上个月帮一家安防厂商做项目优化,他们用RT-DETR做实时人流统计,部署在NVIDIA A10上。客户反馈说:“GPU利用率才30%,但延迟已经飙到40ms了,加人流量就丢帧。” 我远程一看,好家伙——生产环境里每个请求单独…
Postman 环境变量实战:3种动态设置方法与CI/CD集成避坑指南 Postman 环境变量高阶实战:动态管理与 CI/CD 深度集成在接口自动化测试领域,环境变量的灵活运用往往成为区分初级与高级测试工程师的关键能力。本文将深入探讨 Postman 环境变量的三种动态设置模式,并分享 Newman 在 CI/CD 流水线中的实战避坑…
[C++]内存管理:串顺序存储的内存回收 在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比 移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建 本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…