API网关和ACL

问题描述 投票:2回答:1

我正在设计一个带有两个API端点的基于微服务的应用程序,其中一个用于用户访问。通过JWT进行身份验证的用户可以属于不同的组织,这些组织又按层次组织。每个用户都可以拥有一些角色,这些角色是为每种组织类型定义的;组织和角色之间的组合定义了可以从用户访问哪个API(方法和资源)。总之,它可能变得一团糟!

有几个库提供ACL功能,但我想知道在哪里放置它们:第一个解决方案似乎是API网关,它应该为每个请求调用一个组件。

- JWT包含用户-API网关的角色ID列表,用于验证JWT,并使用角色Ids在表中查找,其中每个角色都有一个权限列表(例如,可以POST / users) - 如果角色与请求匹配,后者被转发到正确的服务;否则,网关以403响应

其他选择是将“auth-service”置于架构中。网关只是转发所有传递给正确服务的请求,每个服务(可能依赖于公共库)将令牌发送给auth服务并请求授权以满足请求。在这种情况下,auth服务是/ auth资源下所有请求的“正确服务”,提供登录/注销,令牌刷新和新用户注册(例如,当您单击提供到登录邮件中的链接时)

第一个解决方案提供了一个“胖网关”,它在逻辑上有一个很小的层,但强制所有服务只响应安全调用,将所有身份验证/编码逻辑分解出来,而不是在服务之间添加依赖关系。

  1. 这是正确的方法吗?
  2. 是否有提供该功能的api网关实现
  3. 在我看不到的两种方法中都存在一些其他优点/缺点

谢谢你的答案!!!

architecture authorization microservices api-gateway
1个回答
0
投票

我回来分享我对围绕帖子主题做出的选择的看法。我遵循的方式是

API网关知道与请求一起发送的身份验证数据(实际上是“授权标头”)并进行验证。 JWT携带所有必要的信息,因此api网关可以应用其下游服务未知的策略。

在我的架构中有一些RBAC,没有什么可以放在jwt中,所以我们在网关上移动了访问控制逻辑。我们调整了一个自定义nodejs库作为插件,但我不得不承认已经弄乱了我们的网关,我们发现authz配置很慢且容易出错。在这方面,我们正在支付缺乏与主要配置信息的集成。这会是有用的

routes:
  - route1:
      path: /foos/:fooid/bar
      downstreamService: http://foo.cluster
      authz:
        readerRole:
          - GET
        writerRole:
          - POST
        all:
          - OPTIONS

但是,Api网关不能单独完成所有工作:需要联系我称之为“身份提供商”的服务,那些将“消费者”概念模型化的平台包含在用户,设备,应用程序中。我们的api网关基于JWT数据执行身份认证,以验证身份是否存在且一切正常。此外,令牌生成/刷新不是api网关关注的问题,但是有一个auth服务器(一个是独立的,另一个仍然嵌入到整体中)是conctaced。所有这些都会产生很多负载,但这可以通过“identites”缓存轻松减轻。只是知道在身份变异时使缓存无效,或者在leat尝试使用尽可能少的信息,这样你就可以关心身份删除了

我们接下来的步骤将是制作/购买更结构化的auth服务器,该服务器将与网关集成,但能够独立扩展,更清晰,易于配置,可能具有某种UI

作为云原生粉丝,我也在看istio,其中包括auth功能,但我仍然需要了解是否适合我的方法需要能够进行一些定制

© www.soinside.com 2019 - 2024. All rights reserved.