将用户登录和身份验证机制添加到SAPBTP平台上的Java应用程序保护您的Java微服务仅接受基于从应用程序路由器收到的有效JSONWeb令牌(JWT)的请求为您的应用程序用户分配角色和范围并让您的后端处理授权信息基本概念在深入了解架构的实际设置之前,让我们快速回顾一下本教程打算采用的架构。下图是在SAPBusinessTechnologyPlatform上运行时的用户身份验证流程。首先,我们创建并运行了一个Java微服务。但是,您将使用所谓的AppRouter,而不是让客户直接访问此应用程序,它有两个用途。一方面,AppRouter是进入微服务世界的通用入口点。主要思想是您可以将您的应用程序拆分为多个具有独立可部署性、多语言运行时和持久性以及独立团队的微服务。因此,需要一个中央入口点组件来向最终客户隐藏微服务环境的复杂性。另一方面,AppRouter主要负责管理身份验证过程。应用程序路由器接收来自用户的未经身份验证的传入请求,并使用用户帐户和身份验证扩展服务(XSUAA)启动OAuth2流程。XSUAA服务是CloudFoundry的UAA服务的特定于SAP的扩展,用于处理身份验证和授权(它可能再次将这方面委托给其他提供者,例如外部身份提供者)。如果用户在XSUAA进行身份验证,它将使用JSONWeb令牌(JWT)进行响应,其中包含经过身份验证的用户和他或她已被授予的所有范围。JWT由应用程序路由器传递给底层微服务,将它们从这项任务中解放出来。同时,这些微服务只能通过有效的JWT访问,从而防止未经身份验证的流量。JWT包含一个签名,每个微服务都需要验证该签名以建立信任。因此,每个服务都需要一个密钥(客户端密钥或公钥)来验证此签名并拒绝任何带有无效JWT的请求。因此,每个服务都必须维护一个服务绑定到XSUAA,为运行时验证提供此信息,如下图所示。为实现这一点,每个微服务都绑定到一个专用的XSUAA实例,该实例将此信息写入VCAP_SERVICES环境变量,微服务可以使用该变量来验证任何令牌的有效性。设置AppRouter,您将让CloudFoundry在部署时自动检索AppRouter。为此,您将首先设置必要的结构。在项目文件夹下新建approuter文件夹,进入该文件夹。创建一个新的package.json文件:{"name":"approuter","dependencies":{"@sap/approuter":"*"},"scripts":{"start":"nodenode_modules/@sap/approuter/approuter.js"}}在approuter文件夹中,新建一个xs-app.json:{"welcomeFile":"index.html","routes":[{"source":"/","target":"/","destination":"app-destination"}]}在项目根目录下,新建manifest.yml:---applications:-name:approuterroutes:-route:approuter-。cfapps..hana.ondemand.com路径:approuter内存:128Mbuildpacks:-nodejs_buildpackenv:TENANT_HOST_PATTERN:'approuter-(.*).cfapps..hana.ondemand.com'目的地:'[{"name":"app-destination","url":"","forwardAuthToken":true}]'services:-my-xsuaa将上述文件中的占位符和子域替换为实际值。通过转到子账户的概览页面,您将在CFcockpit中找到您的子域:了解AppRouter的manifest.yml在CloudFoundry上,每个子账户都分配有一个与租户关联的子域。在多租户场景中,应用路由器需要知道将哪个租户转发给XSUAA服务。这是通过在主机中包含子域来实现的,应用程序路由器将从中提取它。这就是TENANT_HOST_PATTERN发挥作用的地方。它是一个变量,声明如何识别和处理URL中租户的模式。我们希望主机符合approuter-。如果您需要不同的URL模式,则需要相应地更改路由和TENANT_HOST_PATTERN。请注意,只有在真正的多租户应用程序中才需要TENANT_HOST_PATTERN变量,即物理部署为同一部署中的多个客户端提供服务的应用程序。假设您想构建一个多租户应用程序,因为它以云原生开发为目标。但是,如果您有单租户应用程序,则不需要此变量。为实现这一点,xs-security.json安全描述符可以声明“tenant-mode”:“dedicated”(参见下面的第5步)。转到目的地条目。它是一个变量,声明从应用路由器到底层后端微服务的内部路由。由于您只有一个微服务,因此您只能在此处定义一个名为app-destination的目的地。此应用程序目标由先前创建的xs-app.json文件引用。最后但同样重要的是,服务部分声明将您自己的XSUAA服务实例绑定到应用程序路由器。此绑定将确保相应的VCAP_SERVICES条目包含验证来自XSUAA服务的任何传入OAuth令牌/JWT所需的客户端ID、客户端机密和公钥:绑定XSUAA服务现在您需要创建一个到XSUAA服务的服务绑定。作为先决条件,您需要一个xs-security.json(安全描述符)文件,其中包含有关您打算在应用程序中使用的授权范围的声明。例如,只需声明一个DISPLAY范围,稍后将使用它来授权您的用户。此外,声明了一个名为Viewer的角色模板,它引用了我们的DISPLAY范围。将此文件放入/xs-security.json。可以在此处找到有关xs-security.json语法的更多详细信息。xs-security.json:{"xsappname":"firstapp-","tenant-mode":"shared","scopes":[{"name":"$XSAPPNAME.Display","description":"display"}],"role-templates":[{"name":"Viewer","description":"Requiredtoviewthingsinoursolution","scope-references":["$XSAPPNAME.Display"]}]}使用命令行创建一个新的xsuaa服务实例:cfcreate-servicexsuaaapplicationmy-xsuaa-cxs-security.json使用cfpush将approuter部署到SAPBTPCloudFoundry环境。之后,您应该能够使用部署的主机名从浏览器中找到应用程序路由器。在我的例子中,这是https://approuter-p1942765239...,您应该看到以下登录页面,您可以在其中使用您的用户电子邮件和密码:输入用户名和密码后,您应该看到hello这个Java微服务的输出在世界:更多Jerry原创文章在这里:《王子熙》: