支持Nacos 2.1.0!这套Spring Cloud Gateway + Oauth2 微服务权限终极解决方案升级了!

最近经常有小伙伴问我关于在微服务中使用Oauth2的问题,这次抽空把之前文章中的Demo给升级了,支持了最新版的Spring Cloud和Nacos。今天再来介绍下这套微服务权限终极解决方案,希望对大家有所帮助!

SpringCloud实战电商项目mall-swarm(8.8k+star)地址:github.com/macrozheng/…

实现思路

首先还是来聊聊这套解决方案的实现思路,我们理想的解决方案应该是这样的,认证服务负责统一认证,网关服务负责校验认证和鉴权,其他API服务则负责处理自己的业务逻辑。安全相关的逻辑只存在于认证服务和网关服务中,其他服务只是单纯地提供服务而没有任何安全相关逻辑。

这套解决方案中相关服务的划分如下:

micro-oauth2-gateway:网关服务,负责请求转发和鉴权功能,整合Spring Security+Oauth2;

micro-oauth2-auth:认证服务,负责对登录用户进行认证,整合Spring Security+Oauth2;

micro-oauth2-api:API服务,受网关服务的保护,用户鉴权通过后可以访问该服务,不整合Spring Security+Oauth2。

升级注意点

这里项目的依赖版本都升级了,支持SpringBoot 2.7.0和最新版的Spring Cloud;

2.7.02021.0.32021.0.1.0复制代码

这里不得不吐槽下Spring Cloud的版本号,之前名字采用了伦敦地铁站的名字,根据字母表的顺序来对应版本时间顺序,后来又改成了年份,现在又添加了之前废弃的地铁站名字作为别名,真是让人迷惑;


SpringBoot 2.7.0版本中使用Maven插件需要添加版本号;

org.springframework.bootspring-boot-maven-plugin${spring-boot.version}复制代码

最新版本的Spring Cloud已经放弃使用Ribbon来做负载均衡了,转而使用LoadBalancer,所以网关服务micro-oauth2-gateway中还需添加LoadBalancer依赖;

org.springframework.cloudspring-cloud-starter-loadbalancer复制代码

如果不添加LoadBalancer依赖,从网关调用任意服务会返回Service Unavailable错误信息;

{"timestamp":"2022-06-28T02:36:31.680+00:00","path":"/auth/oauth/token","status":503,"error":"Service Unavailable","requestId":"c480cefa-1"}复制代码

micro-oauth2-auth认证服务需要升级版本,注意使用的JWT库也要同步升级;

org.springframework.cloudspring-cloud-starter-oauth22.2.5.RELEASEcom.nimbusdsnimbus-jose-jwt9.23复制代码

下载Nacos 2.1.0版本,下载地址:github.com/alibaba/nac…


下载完成后解压到指定目录即可,使用如下命令启动Nacos;

startup.cmd -m standalone复制代码

访问Nacos控制台,使用账号密码nacos:nacos进行登录,访问地址:http://localhost:8848/nacos/


使用

本文仅作为微服务权限终极解决方案,Spring Cloud Gateway + Oauth2 实现统一认证和鉴权! 升级版本的补充,具体代码实现可以参考该文,下面演示下该解决方案中的统一认证和鉴权功能。

首先需要启动Nacos和Redis服务,然后依次启动micro-oauth2-auth、micro-oauth2-gateway及micro-oauth2-api服务,启动完成后Nacos服务列表显示如下;


使用密码模式获取JWT令牌,访问地址:http://localhost:9201/auth/oauth/token


不带JWT令牌访问受保护的API接口,访问地址:http://localhost:9201/api/hello


带JWT令牌访问受保护的API接口,注意请求头Authorization添加Bearer 前缀,可以正常访问;


使用获取到的JWT令牌访问获取当前登录用户信息的接口,访问地址:http://localhost:9201/api/user/currentUser


当JWT令牌过期时,使用接口返回的refreshToken获取新的JWT令牌,访问地址:http://localhost:9201/auth/oauth/token


使用没有访问权限的andy:123456账号登录,访问接口时会返回如下信息,访问地址:http://localhost:9201/api/hello


总结

在微服务系统中实现权限功能时,我们不应该把重复的权限校验功能集成到每个独立的API服务中去,而应该在网关做统一处理,然后通过认证中心去统一认证,这样才是优雅微服务权限解决方案!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容