SpringCloud Alibaba微服务实战二十八 - 网关授权VS微服务授权

简介: SpringCloud Alibaba微服务实战二十八 - 网关授权VS微服务授权

在SpringCloud架构中,实现授权功能有两种实现方式:

  • 在网关层进行授权
  • 由后端微服务自己授权

两种方式在此系列文章中都有实现方案,那么问题来了:哪种才是最优方案,哪种方案更合理呢?

很抱歉,看完这篇文章你也不一定能得到你想要的答案,因为结论是并没有最优方案,两种方案各有千秋,只有根据自身业务选择对应的方案。本文我们将两种方案做一个简单对比,以便大伙在做方案决策有个选择参考。


解决方案对比


首先我们看看两种方案实现的原理:如果对具体实现方式有疑问的同学可以参考这篇文章:

SpringCloud Alibaba微服务实战十九 - 集成RBAC授权


网关授权

基于网关授权我们又叫基于路径匹配器授权,请求在经过网关的时候校验当前请求的路径是否在用户拥有的资源路径中。

在基于路径匹配器授权时需要考虑restful风格的访问路径,如 /account-service/blog/user/{id}/account-service/blog/**等,所以在网关进行授权主要是基于通配符匹配


微服务授权

微服务授权我们又叫基于方法拦截,在资源上打上对应的方法标识然后分配给用户。在请求方法上通过对应的注解判断当前用户是否有访问此方法的权限。如SpringSecurity中的 @PreAuthorize("hasAuthority('')")注解,Shiro中的 @RequiresPermissions('')注解。不管是SpringSecurity还是Shiro他们实现原理都是基于关键字完全匹配


优缺点对比


网关授权

优点

使用网关授权的优点很明显,后端所有微服务只需要是普通的服务即可,不再需要依赖权限那一套。

缺点

  1. 通配符匹配在网关做性能比较差,通配符要拆分,先匹配前缀,前缀匹配了再匹配通配符。这里大家可以看看org.springframework.util.AntPathMatcher#doMatch()的实现逻辑。
  2. 对于Restful风格的URL路径,不能精细化控制权限
    例如一个微服务有如下API
    GET /v1/pb/user
    POST /v1/pb/user
    PUT /v1/pb/user
    这样在网关通过request.getURI().getPath()方法获取到用户请求路径的时候都是同一个地址,给一个用户授予/v1/pb/user权限后他就拥有了GETPUTPOST三种不同权限,很显然这样不能满足精细权限控制。
    至于如何解决这个问题,原来专门写过一篇文章讨论,感兴趣的同学可以看看:SpringCloud Alibaba微服务实战二十五 - Restful接口拦截

微服务授权

优点:

上面提到网关授权的缺点实际上是微服务授权的优点,基于方法拦截是完全匹配,cpu消耗很少,而且也不存在RestFul的问题。

缺点:

实现较为复杂,在 SpringSecurity Oauth2体系中需要全部引入资源服务器相关配置,所以一般会建立一个单独的资源服务器模块,这也是系列文章下篇内容需要解决的问题。


结论


这里我们尝试对两种实现方案做一个总结,如果系统功能、业务模块不是很多可以采用网关授权模式,这样实现最简单也最方便,虽然存在Restful风格不能精细化权限控制问题,但是我们加一个Method字段就可以解决。

如果你的系统规模比较大,有很多资源需要授权那就建议采用微服务授权模式,那为了避免每个微服务都需要处理权限校验的逻辑,我们还需要抽取一个公共的权限认证模块供后端服务引用。


以上,希望对你有所帮助!

目录
相关文章
|
4天前
|
负载均衡 监控 算法
【微服务 SpringCloud】实用篇 · Eureka注册中心
【微服务 SpringCloud】实用篇 · Eureka注册中心
12 1
|
4天前
|
存储 SpringCloudAlibaba Java
【微服务 SpringCloud】实用篇 · 服务拆分和远程调用
【微服务 SpringCloud】实用篇 · 服务拆分和远程调用
19 2
|
4天前
|
Prometheus 监控 负载均衡
【SpringCloud】微服务重点解析
【SpringCloud】微服务重点解析
13 0
|
4天前
|
缓存 负载均衡 算法
【微服务 SpringCloud】实用篇 · Ribbon负载均衡
【微服务 SpringCloud】实用篇 · Ribbon负载均衡
13 0
|
4天前
|
消息中间件 Java RocketMQ
Spring Cloud RocketMQ:构建可靠消息驱动的微服务架构
【4月更文挑战第28天】消息队列在微服务架构中扮演着至关重要的角色,能够实现服务之间的解耦、异步通信以及数据分发。Spring Cloud RocketMQ作为Apache RocketMQ的Spring Cloud集成,为微服务架构提供了可靠的消息传输机制。
30 1
|
4天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo: 微服务通信的高效解决方案
【4月更文挑战第28天】在微服务架构的发展中,服务间的高效通信至关重要。Spring Cloud Dubbo 提供了一种基于 RPC 的通信方式,使得服务间的调用就像本地方法调用一样简单。本篇博客将探讨 Spring Cloud Dubbo 的核心概念,并通过具体实例展示其在项目中的实战应用。
22 2
|
4天前
|
Cloud Native Java Nacos
Spring Cloud Nacos:概念与实战应用
【4月更文挑战第28天】Spring Cloud Nacos 是一个基于 Spring Cloud 构建的服务发现和配置管理工具,适用于微服务架构。Nacos 提供了动态服务发现、服务配置、服务元数据及流量管理等功能,帮助开发者构建云原生应用。
21 0
|
4天前
|
负载均衡 Java 网络架构
【SpringCloud】如何理解分布式、微服务、集群
【SpringCloud】如何理解分布式、微服务、集群
24 1
|
4天前
|
Java 数据安全/隐私保护 Sentinel
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
|
4天前
|
运维 监控 Java
SpringCloud&认识微服务
SpringCloud&认识微服务
20 0