最近经常有朋友问我微服务中Oauth2的使用。其实我之前写过一篇相关的文章。这次抽空升级了上一篇文章中的Demo,支持最新版本的SpringCloud和Nacos。今天给大家介绍一下微服务权限的终极解决方案,希望对大家有所帮助!SpringCloud实战电商项目mall-swarm(8.8k+star)地址:https://github.com/macrozheng/mall-swarm实现思路首先说一下本方案的实现思路。我们理想的方案应该是这样的,认证服务负责统一认证,网关服务负责验证认证和认证,其他API服务负责处理自己的业务逻辑。安全相关的逻辑只存在于认证服务和网关服务中,其他服务只是提供服务,没有任何安全相关的逻辑。本方案相关服务划分如下:micro-oauth2-gateway:网关服务,负责请求转发和认证功能,集成SpringSecurity+Oau??th2;micro-oauth2-auth:认证服务,负责对登录用户进行认证,集成SpringSecurity+Oau??th2;micro-oauth2-api:API服务,受网关服务保护,用户认证通过后即可访问该服务,不集成SpringSecurity+Oau??th2。升级注意这里项目的依赖版本已经升级到支持SpringBoot2.7.0和最新版本的SpringCloud;2.7.02021.0.32021.0.1.0这里不得不吐槽一下Spring的版本号云,之前的名字用的是伦敦地铁站的名字,按照字母顺序对应版本的时间顺序,后来改成年份,现在又加上了之前废弃的地铁站的名字作为别名,这确实令人困惑;SpringBoot2.7.0版本中使用Maven插件需要添加版本号;org.springframework.bootspring-boot-maven-plugin${spring-boot.version}最新的SpringCloud版本已经放弃使用Ribbon做负载均衡,转而使用LoadBalancer,所以网关服务micro-oauth2-gateway也需要添加LoadBalancer依赖;org.springframework.cloudspring-cloud-starter-loadbalancer如果不添加LoadBalancer依赖,从网关调用任何服务都会返回Ser副Unavailable错误信息;{“时间戳”:“2022-06-28T02:36:31.680+00:00”,“路径”:“/auth/oauth/token”,“状态”:503,“错误”:“服务不可用”,“requestId":"c480cefa-1"}micro-oauth2-auth认证服务需要升级,使用的JWT库也要同步升级;<依赖项><依赖项>org.springframework.cloudspring-cloud-starter-oauth22.2.5.RELEASEcom.nimbusdsnimbus-jose-jwt9.23下载Nacos2.1.0版本,下载地址:https://github.com/alibaba/na...下载完成后解压到指定目录,使用如下命令启动Nacos;startup.cmd-mstandalone访问Nacos控制台,使用账号密码nacos:nacos登录,访问地址:http://localhost:8848/nacos/本文仅作为微服务权限终极解决方案,SpringCloudGateway+Oauth2实现统一鉴权认证!升级版的补充,具体代码实现可以参考本文。下面演示解决方案中的统一认证和鉴权功能。首先需要启动Nacos和Redis服务,然后启动micro-oauth2-auth、micro-oauth2-gateway和micro-oauth2-api服务,启动完成后Nacos服务列表显示如下;使用密码方式获取JWTtoken,访问地址:http://localhost:9201/auth/oa...无JWTtokenAPI接口访问受保护,访问地址:http://localhost:9201/api/hello使用JWTtoken访问受保护的API接口,注意在请求头Authorization中添加Bearer前缀,即可正常访问;使用获取的JWTtoken访问获取当前登录用户信息的接口,访问地址:http://localhost:9201/api/use...当JWTtoken过期后,使用接口返回的refreshToken获取一个newJWTtoken,访问地址:http://localhost:9201/auth/oa...使用没有访问权限的andy:123456账号登录,访问界面会返回如下信息,访问地址:http://localhost:9201/api/hello在功能上,不要将重复的权限验证功能集成到每个独立的API服务中,而应该在网关做统一处理,再通过认证中心进行统一认证.这是一个优雅的微服务权限解决方案!项目源码地址https://github.com/macrozheng...