本章解释了使用用户帐户和授权服务(UAA)的 Cloud Foundry 安全模型以及 SAP HANA XSA 如何实施该模型。OAuth 协议及其在 XSA 的重要作用是这一章的一部分。HDI 容器以及对经典对象的跨模式访问与其他开发工件(如同义词)一起进行了解释,并解决了授权问题,因为它们对于任何准备在 XSA 环境中实施开发的企业中存在的跨模式开发场景都是至关重要的。
用户帐户和授权服务是 Cloud Foundry 架构中的托管服务。它用于根据充当 OAuth 代理的系统对请求进行身份验证,向客户端应用颁发令牌,反过来,这些令牌用于根据与令牌和用户相关联的某些范围对后端系统进行身份验证和授权。该(UAA)服务在用户登录过程中提供帮助,并且还可以充当单点登录授权。在我看来,这是该环境架构中最重要的一步,因为没有它,就不可能对任何用户请求进行身份验证。如果没有经过身份验证的请求,应用或 API 将导致在安全是整个软件系统最重要方面的生产环境中无法访问它。
在 SAP HANA XS 高级版中,该 UAA 托管服务以 JSON Web 令牌(jwt)的形式生成访问令牌。JWT 是一种紧凑且独立的方式,用于以 JSON 对象(RFC 7519)的形式在各方之间安全地传输信息。SAP HANA XSA 中的 jwt 包含用户授权和范围的附加信息。
jwt 的常见用例有
-
授权——这是 JWT 最常见的场景。用户登录后,每个后续请求都将包含允许用户基于其范围访问资源的令牌。单点登录是一个已经广泛使用 jwt 很多年的特性。
-
信息交换–这是一种在各方之间安全传输信息的好方法。还可以使用公钥/私钥对对 jwt 进行签名,以验证请求的真实性。此外,使用报头和有效载荷来计算签名,以验证从原始发送者到接收者的内容没有被改变。
OAuth 是行业标准的授权协议,由 UAA 服务用于授权。OAuth 2.0 专注于客户端开发人员的简单性,同时为 web、桌面和移动应用以及 IoT(物联网)设备提供特定的授权流程。
范围是 OAuth 2.0 中的一种机制,它限制应用对用户帐户的访问。应用可以请求一个或多个作用域。然后,颁发给应用的访问令牌将被限制在授予用户的范围内。通俗地说,作用域定义了可以在服务或应用中执行的操作,例如,能够对 REST API 执行创建、更新、删除和读取。在请求作用域和直接从这些授权服务器访问之前,开发人员必须(或至少尝试)考虑所有可能的方法来防止对应用的未授权访问。开发者必须遵循现在大多数公司执行的简单规则,例如谷歌、脸书、AWS。
创建新用户时,通常会看到这些新帐户默认具有
-
最低权限(或者像 AWS 中的新用户一样没有任何权限)
-
增量授权(仅请求所需内容而不请求额外内容的过程)
-
受限范围(仅提供完成某人日常任务所需的权限,并且必须经过证明)
-
安全评估(旨在最大限度地减少对某些帐户的过多范围的未授权请求。一些评估对于立即消除黑客行为来说成本很高)
通过历史和经验,这些规则更有意义。开发人员通常希望拥有所有类型的权限,这样他们就不会重复向管理员团队请求访问权限;但是,这些规则和做法是为了最大限度地降低向未授权用户暴露数据的风险,并保护数据隐私。
回到协议的定义,OAuth 协议用于让客户端应用知道它在系统上的授权,而不一定是用户是谁或者他们想做什么。Oauth.net 网站上描述的一个完美的例子是使用一个酒店客户进行比较。
该客户到达酒店并出示了他/她的身份证明和支付方式(凭证)。反过来,酒店大厅的某个人(授权服务器)给了客户一把房间钥匙(令牌),然后这把钥匙被批准打开一扇门(某个 API)。该钥匙不是用于打开所有的门,而是仅用于打开授权给用户的门,仅在用户停留期间使用(最终会过期,同一把钥匙将不起作用),如图 2-1 所示。
图 2-1
OAuth 类比
除了 OAuth 令牌之外,开发人员还可以在他们的应用中加入额外的保护措施,比如跨源资源共享(CORS)和跨站点请求伪造(CSRF)。
使用 CORS,可以基于域启用或禁用对特定资源的访问。可以修改 CORS 设置,以设置访问或拒绝访问的特定来源。
在应用路由配置中(在 HTML5 模块的 xs-app.json 文件中),开发人员需要指定需要保护哪些路由。CSRF 设置称为 xsrfProtection(默认值为 true)。这些保护适用于任何改变服务器端状态的 HTTP 请求(PUT、POST、DELETE)。
jwt 有不同的生成和使用方式。最常见的 JWT OAuth 2.0 访问类型是承载令牌。不记名令牌是一个长的加密字符串,对客户端可能没有任何意义。一些服务器可能发布短字符串十六进制令牌,而其他服务器可能将令牌构造为 jwt。我们将在第 4 章中看到这个令牌。
Cloud Foundry 架构中的另一种服务是自定义用户提供的服务(CUPS)。根据定义,这些 cup 是由开发人员用户创建的服务,而不是由框架创建的。此外,创建这些服务是因为市场提供的其他服务不存在。一旦创建,CUPS 的行为将类似于通过市场创建的服务。其服务实例将使开发人员能够使用应用绑定来配置他们的应用——CF 使用相同的应用运行时环境变量来自动提供市场服务的凭证。在 XSA 环境中,可以从 SAP HANA XSA 驾驶舱或通过 Linux 终端使用 XS CLI 查看这些服务。
在 SAP HANA XSA 中创建用户提供的服务的用途之一是能够从数据库模块访问经典模式表。
让我们首先在系统数据库中创建一个模式(或者您选择的不同模式),如图 2-2 所示。
图 2-2
在 SAP HANA 中创建模式
一旦创建了一个模式,继续在这个模式中创建一个数据库表,如图 2-3 所示。
图 2-3
在 SAP HANA 中创建表格
一旦创建了表,就验证它。运行 select 语句查看初始的空表,然后向该表添加数据。在本练习中,单个 insert 语句运行了几次。控制台日志显示成功插入的语句,如图 2-4 所示。
图 2-4
添加样本数据
再次验证表格,确保记录确实成功创建,如图 2-5 所示。
图 2-5
验证插入的数据
此时,表中有足够的内容来模拟一个经典的 SQL 模式。接下来,分析需要创建的 XSA 项目。首先创建一个 MTA 类型的新项目(多目标应用)。
请记住,从 Cloud Foundry 层级结构来看,应用属于一个单独的空间。在这个初始步骤中,选择在项目创建过程中将应用绑定到的 XSA 空间。还要注意应用版本(初始版本 0.0.1)。在部署过程中,应用版本有助于部署新功能或应用错误修复。目前,保持这个应用版本为 0.0.1。
图 2-6 后点击完成并确认。
图 2-6
创建新的 mta 项目
一旦创建了项目,它将显示在 SAP Web IDE 的工作区下,默认结构包括 mta.yaml 文件,类似于图 2-7 。
图 2-7
在工作区中显示新项目
我们开始工作吧。首先创建一个名为 db 的数据库模块,这样它可以保存数据库模型、存储过程、同义词以及其他工件,如图 2-8 所示。
图 2-8
创建数据库模块
第一步是提供一个模块名。为简单起见,将其命名为 db ,如图 2-9 所示。
图 2-9
命名数据库模块
然后, db 模块向导将询问可选的名称空间、模式名称和首选的 SAP HANA 数据库。此时,使用版本 HANA 2 SPS 04 来利用环境中的最新功能和开发,如图 2-10 所示。
图 2-10
选择数据库版本
点击下一步,然后完成,如图 2-11 所示。如果提供的一切都正确,应该会出现确认消息,在关闭它之后,新创建的模块将显示在 wavepress 项目中。
图 2-11
数据库模块创建的确认
由于勾选了进行数据库模块初始构建的复选框,创建模块并运行第一个 db 模块构建可能需要几秒钟时间。这样做是为了确保正确创建了 db 模块和 HDI (HANA 部署基础设施)容器。在向项目中添加任何更多的开发之前,所有的都应该是内联的,并且在初始安装和项目创建中没有任何问题。SAP Web IDE 控制台将显示构建日志,最终应该会出现一条成功构建的消息。随着这一进程的结束,在后台发生了一些事情。构建了 db 模块,用 HDI 容器更新了 mta.yaml 文件,更新了 HDI 名称空间,在数据库中创建了一些容器用户,最后,收到了完成日志消息。此时,所发生的大部分事情在 Web IDE 中可能是不可见的。是可以的;这些项目可以稍后验证。现在,假设 Web IDE 已经按照预期完成了所有工作,如图 2-12 所示。
图 2-12
Web IDE 控制台生成消息
如果在项目内部展开 db 模块,那么会创建一个 src 文件夹和一个 package.json 文件。 src 文件夹将用于存放开发工件(如模型、存储过程、同义词),而 package.json 文件在每次触发 db 模块构建时使用。该文件中包含在项目构建期间使用的元数据,包括依赖项和构建信息,如图 2-13 所示。
图 2-13
SAP Web IDE 显示了数据库模块和数据库模块中的 package.json
到目前为止,唯一已经完成的工作是数据库模块。开发人员不希望在某个时候看到数据库屏幕吗?是的。请注意 SAP Web IDE 的左侧导航面板;到目前为止,所有的工作都已经在工作区部分完成了,它用一个 xml 标记图标表示。
数据库浏览器部分是工作区图标下面的下一个图标(用四个立方体表示)。点击它,看看会发生什么。在其他数据库系统中,第一次打开数据库时,它会提示输入连接字符串设置和凭据。它与 SAP HANA 数据库浏览器没有什么不同。由于此时尚未配置任何数据库连接,并且 SAP Web IDE 知道当前项目正在使用 HDI (HANA 部署基础设施)容器(在 db 初始模块构建期间创建,并且在数据库模块创建期间尚未指定任何要使用的模式),因此它将询问是否应该现在添加一个。此时的选项是映射到默认的 HDI 容器,或者,如果已知任何模式凭证,那么也可以建立连接,如图 2-14 和 2-15 所示。
图 2-14
第一次打开数据库浏览器
从默认的 HDI 容器开始。注意,HDI 容器名由用户名、一些惟一的标识符、项目名、hdi_db 和括号中的空间名组成。如果创建了一个以上的 HDI 容器连接,将遵循类似的模式。此时继续使用默认设置。这个 HDI 容器将包含我们从数据库模块创建的任何 CDS 模型(hdbcds 文件)和同义词。另一方面,经典模式连接将包含来自经典世界的任何数据库对象。
图 2-15
添加数据库连接(显示 HDI 容器)
如果 HDI 容器连接建立正确,应该是这样的。选择表部分,注意没有最初由 HDI 容器创建的表。稍后,在创建表之后,它们将显示在此部分中。如果表格列表太长,可以在图 2-16 底部的搜索框中输入几个字符进行细化。
图 2-16
显示来自数据库连接的 HDI 容器
现在, db 模块有了 HDI 容器,并且已经正确构建。在演示场景中,对于创建模型、查看表格和查询数据的人来说,这些步骤可能已经足够了。在真实的场景中,情况并非如此。在真实的场景中,开发人员需要使用和集成逻辑上分离的数据库表或模式中的数据。开发人员可能需要创建混合信息模型,并从计算视图提供这些数据,或者从存储过程或表函数中查询这些数据。假设到目前为止只创建了一个 HDI 容器和数据库模块,开发人员将如何实现这样的场景呢?请记住,SAP HANA XSA 环境遵循 Cloud Foundry 原则,开发人员还必须了解容器之间的安全性和容器隔离概念;访问单独的模式不再像在 SAP HANA 1 中那样简单。
在 SAP HANA XS 高级架构中,需要创建自定义用户提供服务(CUPS ),并授予对 CUPS 服务架构的访问权限。在 SAP HANA XSA SPS 03 之前,这一步必须从 XS 命令行使用 xs cups 命令完成
xs CUPS{ CUPS _ NAME }–“主机”、“端口”、“用户”、“密码”、“驱动程序”、“标签”、“模式”(如果开发人员不熟悉命令语法,并且如果开发人员以前没有使用 cli 工具的经验,这将是一个非常繁琐的过程)
db 模块有一个新特性叫做 **SAP HANA 服务连接——**如图 2-17 使用 SAP HANA XSA SPS 04 所示。要使用该功能,右键单击 db 模块,选择 New,然后选择 SAP HANA Service Connection。
图 2-17
添加 SAP HANA 服务连接(定制服务)
选择该功能时(图 2-17 ),会出现一个向导提示输入 CUPS 设置,如名称、数据库连接详情和认证凭证,如图 2-18 所示。创建此 CUPS 服务时要小心,因为在 db 模块重建之前,不会向用户显示由于不正确的身份验证而导致的任何错误设置。完成此步骤后,mta.yaml 文件中的设置将被更新。
图 2-18
自定义服务属性
打开 mta yaml 文件,查看添加的新部分。注意,新的 CUPS 服务出现在参考资料部分。如果提供的凭证不正确,在构建 db 模块后,控制台中将显示一条 CUPS 服务的错误消息。在 db 模块中删除新添加的资源(CUPS 服务)和新需要的服务。解决此问题后,返回并添加新的 SAP HANA 服务连接,直到获得成功的 CUPS 连接。当不再显示错误消息时,确定连接成功。此步骤可能需要多次尝试才能成功。以下是一些有助于成功创建 SAP HANA 服务连接的提示:
-
在添加 CUPS 之前,确保 db 模块总是构建成功——这将节省大量调试时间。不要试图一次调试许多问题;分而治之!
-
当添加 CUPS 服务时(从 db 模块>新建> SAP HANA 服务连接),立即打开 mta yaml 文件查看其结构。请注意 Resources 部分和创建的新项目(类型为 org . cloud foundry . existing-service)。
-
知道了 db 模块将需要新创建的资源作为必需模块——这是 db 模块能够正确连接到经典模式的唯一方式——小心地确保必需部分使用定义的 CUPS 资源的名称。
-
对过程有耐心会使开发更成功。
所有先前的步骤将产生图 2-19 。
图 2-19
包含数据库模块和定制服务详细信息的 mta 文件
同义词允许对象用不同的名字来称呼某物。在 SAP HANA XSA 中,系统利用这些同义词来读取 HANA 经典模式(非 HDI 容器)。需要创建 HANA 同义词(hdbsynonym 文件),以便使用来自系统模式的虚拟表。如果同义词的使用者从源数据获得了访问权限,那么同义词就可以工作。同义词本身似乎是不必要的;然而,它们的重要性将在下文中展示。
添加 CUPS 服务并再次重建 db 模块后,需要为这个 CUPS 服务分配(授予)模式特权。通过模式所有者授予访问权,该帐户授予通过名为 hdbgrants 的对象查询模式 WAVEPRESS 的权限,如图 2-20 所示。
图 2-20
hdbgrants
hdbgrants 文件是一个 JSON 格式的文件。它通过来自 mta.yaml 文件的名称“ServiceName_1”指定了一个 object_owner 。它进一步表示作为 SAP HANA 服务连接创建的 WAVEPRESS_SVC CUPS 服务。除了将服务名绑定到 CUPS,对象所有者还分配模式特权(选择、选择元数据、创建、更新、删除)。
hdbgrants 文件中的以下部分确认了将接收引用数据库模式的 schema_privileges 的 application_user ,以及被授权者将能够在开发期间应用的特权。
在添加这个 hdbgrants 文件并保存它之后,在继续之前,需要正确地重新构建 db 模块,而不引入任何语法错误。
选择 db 模块。右键单击并选择构建。如果构建成功,则继续;否则,请返回并调整 CUPS 服务、mta 文件或 hdbgrants 文件。由于各种集成点和敏感的语法,这可能需要几次迭代才能正确完成。
仔细阅读 SAP Web IDE 控制台,了解错误消息的详细信息。遇到的一些错误可能是由于 CUPS 创建过程中的不正确凭证造成的。如果遇到错误,重复前面提供的步骤。如果 CUPS 服务被重命名,并且不知道旧服务是否仍然存在(从 SAP Web IDE 中看不到),则导航到 XSA 驾驶舱以查看当前系统中存在的服务实例。
如果在重新创建这些 cup 时更改了服务名称,孤立服务将存在于驾驶舱中。如果出现这种情况,请转到驾驶舱,导航到服务实例,并在清理这些服务时执行尽职调查。
下一步是创建一个同义词,从名为 WAVEPRESS 的跨模式表中选择数据。设备如图 2-21 所示。
图 2-21
hdbsynonym 文件
重复上一步,为虚拟表创建一个同义词,将其添加到同一个 hdbsynonym 文件中(以及以后可能需要的其他文件中),如图 2-22 所示。每当对 db 工件进行修改,并且开发准备好被验证时,构建 db 模块以确保这些工件被正确地更新。如果同义词创建正确,切换到 SQL 控制台并测试新创建的同义词。
图 2-22
同一同义词文件中的多个表
至此,已经创建了一个 CUPS 服务、一个授权文件和一个同义词。现在可以创建计算视图来显示数据库表数据了。
返回到 db 模块,创建一个名为 models 的新文件夹。在该文件夹中,将创建一个新的信息模型。右键单击文件夹,选择新建,然后选择计算视图,在提示时提供一个有意义的名称如下图 2-23 。
图 2-23
创建计算器视图
由于需要公开 DEVICES 表,因此模型名称将为 CV_DEVICES。默认情况下,该视图将被创建为多维数据集视图(在语义层之前需要一个聚合 Node)。保持原样,按照图 2-24 继续。
图 2-24
计算视图初始属性
当执行数据库建模时,模型的开发人员和消费者不需要知道或者不应该关心数据来自哪里,只要他们可以查询表或视图。稍后,在创建视图后,将从图形编辑器中包含其他 Node。
从屏幕的中间部分添加一个投影 Node(计算视图 Node 类型)。添加投影后,Node 上会出现一些图标,选择+(加号)以找到所需的数据源–wave press。设备表。瞧啊。选择桌子并将其添加到投影中,如图 2-25 所示。
图 2-25
将数据源添加到计算视图中的投影
随着越来越多的 Node 被添加到图形视图中,模型最终将需要被重新排列,以获得更好的可见性。在计算视图的名称下,会显示一些图标来帮助进行布局、调试和性能分析。选择自动布局图标,使数据模型在视觉上更具吸引力。它现在看起来应该如图 2-26 所示。
图 2-26
自动布局功能
在 Projection_1 Node 中添加数据源后,向上映射列。将数据源框中的列拖动到输出列中,或者如果需要投影所有的列,在映射部分中选择添加到输出图标,如图 2-27 所示。
图 2-27
绘制投影中的列
如果在数据模型构建期间,随着建模向上进行,需要相同的列向上移动,则重复相同的 Add To Output 。映射出的列将显示为从源到目标的一条线。如果需要计算列,也可以通过转至“计算列”选项卡并根据需要添加它们,如图 2-28 所示。
图 2-28
列映射
在视图创建过程中,多维数据集视图是从初始创建向导中设置的默认行为。现在可以将数据类别更改为维度视图(非聚合)。通过选择语义层之前的聚合 Node 并单击它(图 2-29 ),选择切换到投影,因此不需要向输出添加度量。其他功能,如数据预览,也显示在上下文菜单中。这些功能逐个 Node 地出现。数据预览功能在数据模型调试期间非常有用——在第 3 章中描述。
图 2-29
聚合 Node 中的列映射
随着开发从底层 Projection_1 Node 向上移动到语义层,将会看到要输出的列和标签(在表创建期间添加的注释)以及它们的预期数据类型(度量与属性),如图 2-30 所示。
图 2-30
语义层,用于设置数据聚合和列类型
计算视图中另一个有用的功能是重命名 Node 的能力。在开发过程中使用有意义的名称有助于理解每个 Node 中做了什么。底部 Node 从 Projection_1 重命名为 p_devices,因为它表示设备表的投影。需要注意的是,在语义层视图属性中,数据类别属性被设置为维度(来自默认的多维数据集视图设置),如图 2-31 所示。
图 2-31
语义层视图属性
当对视图的更改令人满意时,再次右键单击 db 模块并构建它。如果 db 模块构建成功,那么确保它可以从视图中读取数据。
右键单击视图,并选择数据预览–这是生成计算视图数据的示例视图的简单方法,无需在 SQL 控制台中键入“select * from view”的整个查询,如图 2-32 所示。
图 2-32
运行视图的数据预览
选择“原始数据”选项卡,如图 2-33 所示。
图 2-33
显示原始数据窗口
创建数据模型后,在 db 模块中创建一个存储过程。将展示模拟创建、更新和删除操作的场景——首先从 SQL 控制台,然后从 api 模块。创建一个名为 procs 的文件夹来保存存储过程。在该文件夹中,创建一个存储过程,并将其命名为 SP_DEVICE_UPSERT,如图 2-34 所示。该过程的目的是在记录不存在时创建一个新记录;否则,应该根据主键更新记录。
图 2-34
显示创建的新存储过程
该存储过程被编码为以表类型结构的形式接受输入参数,输出将是最后插入或更新的记录的 ID(称为 identity)。为了便于说明,这里显示的代码非常简单,它不处理不存在的 id 或任何错误消息。假设死刑会通过快乐之路来执行。确保存储过程不包含读取 SQL 数据,以便它可以对数据库表执行创建或更新操作——在图 2-35 的第 7 行注释掉。
图 2-35
存储过程示例代码
由于将使用更多的特权(插入、创建、删除),因此需要更新 hdbgrants 文件以包含额外的特权,从而避免在 db 模块的开发和构建过程中出现错误,如图 2-36 所示。
图 2-36
显示模式特权的 hdbgrants 文件
更新了这些工件之后,现在重新构建 db 模块。如果构建成功,系统将在后台更新 hdbgrants 配置,并且将在 HDI 容器中创建存储过程。
从数据库浏览器窗口验证这个假设,查看 HDI 容器连接下的存储过程,如图 2-37 所示的过程部分。
图 2-37
数据库资源管理器中显示的存储过程
创建存储过程后,从 SQL 控制台对其进行验证。为了对该数据库对象进行单元测试,需要完成以下工作:
图 2-38
在临时表中创建一些数据
-
创建一个本地临时表,其结构与表类型的输入参数类似。
-
从 SQL 控制台向该临时表中添加至少一条记录,如图 2-38 所示。
图 2-39
显示本地临时表中的数据
- 验证新添加的记录(图 2-39 )。
图 2-40
调用存储过程
- 执行如图 2-40 所示的调用语句。
图 2-41
验证通过存储过程运行的数据
- 验证表格以确保表格中最近创建的记录确实是返回的记录,如图 2-41 所示。
为了通过存储过程运行更新,执行下一组步骤(图 2-42 ):
图 2-42
用现有记录填充临时表以模拟更新
-
从本地临时表中删除现有记录。
-
将表中的现有记录添加到临时表中。
-
在本练习中,它显示为记录 ID = 20,将其 TEMP_F 值更改为 26。
-
该存储过程还会将 REC_DT 更新为当前日期。
-
再次运行 call 语句,验证存储过程是否更新了所需的记录(图 2-43 )。
第一个输出(显示为 Result1 选项卡)来自运行 call 语句,OUT_ID 列被映射到占位符**?**来自调用语句。
图 2-43
存储过程的输出返回被更新的记录的 ID
第二个输出窗口(如图 2-44 中的 Result2 选项卡所示)显示运行的 select 语句。它使更新的记录生效,并且也以降序显示在控制台上,如图 2-44 所示。验证 TEMP_F 值已正确更新,并且 REC_DT 首先显示最新更新。
图 2-44
更新后验证表
这个相同的存储过程将在 Node JS 模块中使用,并在本练习的后面章节中演示。
最后一个场景描述了如何删除记录。运行删除语句的程序代码如图 2-45 所示。确保代码不包含读取 SQL 数据的行,这样它就可以对数据库表执行删除操作。
图 2-45
显示删除操作的存储过程
一旦 db 模块成功重建,新的存储过程将出现在数据库浏览器的过程部分,如图 2-46 所示。
图 2-46
删除数据库资源管理器中显示的记录的存储过程
在执行 SP_DEVICE_DELETE 语句之前,运行一条 select 语句来显示表中的当前记录,如图 2-47 。
图 2-47
表数据,然后运行存储过程来删除记录
接下来,从 SQL 控制台执行存储过程以对其进行单元测试,运行 call 存储过程语句并从可用记录中传递一个 id(本练习假设有效 ID 总是传递给存储过程),如图 2-48 所示。
图 2-48
运行存储过程删除记录后的输出
如图 2-49 所示,重新运行 select 语句以验证记录已被成功删除。
图 2-49
删除记录后验证表中的数据
暂时保持存储过程不变。当从 api 模块调用时,将在后面的章节中使用它。
在本章结束时,您应该对 CF 安全层及其在 HANA XSA 中的实施有所了解。OAuth 协议在 XSA 微服务的开发中扮演着重要的守卫角色,因为 XSA 环境遵循相同的请求和验证令牌的架构和方法。引入了一些工件,比如同义词、用户提供的服务和授权,这些都有助于跨模式环境中的数据访问。
















































