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

本贴最后更新于 1105 天前,其中的信息可能已经东海扬尘

在 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/userPOST /v1/pb/user``PUT /v1/pb/user
    这样在网关通过 request.getURI().getPath() 方法获取到用户请求路径的时候都是同一个地址,给一个用户授予 /v1/pb/user 权限后他就拥有了 GETPUTPOST 三种不同权限,很显然这样不能满足精细权限控制。

    至于如何解决这个问题,原来专门写过一篇文章讨论,感兴趣的同学可以看看 SpringCloud Alibaba 微服务实战二十五 - Restful 接口拦截

微服务授权

优点:

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

缺点:

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

结论

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

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

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    938 引用 • 1456 回帖 • 171 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...