带有SAP S4SDK / CAPM的Spring Security:如何为用户分配角色?

时间:2019-03-11 10:32:26

标签: spring-security sap cloudfoundry s4sdk sap-cloud-platform

我将SAP S / 4HANA Cloud SDK(S4SDK)与Cloud Application Programming Model(CAPM)结合使用。我在Neo中拥有工作流和Fiori工件,这些工件消耗了Cloud Foundry(CF)中运行的S4SDK服务。然后,S4SDK服务使用系统用户调用S / 4HANA(公共)云。我已按照以下链接设置了从Neo到CF的原则传播:

Principal Propagation from the Neo to the Cloud Foundry Environment

我已经在开发我的项目几个月了。现在是时候建立对我的OData服务的基于角色的访问了。我需要确保我具有后端验证,以检查例如只有批准者才能将我的请求状态设置为“已批准”。

我计划通过在my-service.cds文件中声明多个OData服务来实现此目的。然后使用spring-security,我将只授予具有批准者角色集合访问权限的人访问批准者服务。

我正在关注此博客:

Step 7 with SAP S/4HANA Cloud SDK: Secure your Application on SAP Cloud Platform, CloudFoundry

我的xs-security.json看起来像这样:

{
  "xsappname": "s4projectcreate",
  "tenant-mode": "dedicated",
  "description": "Security profile of called application",
  "scopes": [
    {
      "name": "uaa.user",
      "description": "UAA"
    },
    {
      "name": "$XSAPPNAME.AdminApprove",
      "description": "UAA"
    },
    {
      "name": "$XSAPPNAME.RiskApprove",
      "description": "UAA"
    }
  ],
  "role-templates": [
    {
      "name": "Token_Exchange",
      "description": "UAA",
      "scope-references": [
        "uaa.user"
      ]
    },
    {
      "name": "Admin_Approver",
      "description": "Request Admin Approver",
      "scope-references": [
        "$XSAPPNAME.AdminApprove"
      ]
    },
    {
      "name": "Risk_Approver",
      "description": "Request Risk Approver",
      "scope-references": [
        "$XSAPPNAME.RiskApprove"
      ]
    }
  ]
}

我在spring-security.xml中输入了以下条目(否则按照博客):

<sec:intercept-url pattern="/odata/v2/ProjCreateApprover/**" access="#oauth2.hasScope('${xs.appname}.AdminApprove')" method="GET" />
<sec:intercept-url pattern="/odata/v2/**" access="isAuthenticated()" method="GET" />

当我进入CF座舱(组织级)并导航到“安全性/角色”部分时,我可以创建一个新的角色集合并向其中添加两个角色模板。

然后,我导航到“信任配置”,在其中可以看到SCIA(又称为SAP Cloud Identity)和“ Neo”部分。当我设置从Neo到CF的原理传播时,我配置了后者。我可以进入任何一个帐户,然后输入我的用户电子邮件地址。然后,我可以将角色集合分配给用户(我)。

问题是,我在这里所做的任何事情似乎都无法使我通过新的安全检查。当我尝试访问受保护的路径时,总是会收到以下消息:拒绝访问access_denied

我应该如何分配这个角色?我是否使用电子邮件地址,因为通常是CF中的ID?我应该在空间甚至应用程序级别上做某事吗?我需要重新绑定XSUAA服务吗?

我正在浏览器中进行测试。如果我还没有会话,那么我可以登录。不受保护的服务仍然可以正常工作。

附录:这是JWT有效负载。看起来我确实具有该角色的作用域:

{
  "jti": "aa4f13c4c456429ab7d7f**218b1ef86",
  "ext_attr": {
    "enhancer": "XSUAA",
    "zdn": "test**n"
  },
  "given_name": "P0000**",
  "xs.user.attributes": {},
  "family_name": "unknown.org",
  "sub": "123526eb-fda8-49cf-a507-506**d28efba",
  "scope": [
    "s4projectcreate!t23.AdminApprove",
    "openid",
    "s4projectcreate!t23.RiskApprove",
    "uaa.user"
  ],
  "client_id": "sb-s4projectcreate!t23",
  "cid": "sb-s4projectcreate!t23",
  "azp": "sb-s4projectcreate!t23",
  "grant_type": "urn:ietf:params:oauth:grant-type:saml2-bearer",
  "user_id": "1235**eb-fda8-49cf-a507-506b8d28efba",
  "origin": "httpsap1.hana.ondemand.comc3d8**a55",
  "user_name": "p0000**",
  "email": "P0000**@unknown.org",
  "rev_sig": "8f**7376",
  "iat": 1552347533,
  "exp": 1552390733,
  "iss": "http://test**n.localhost:8080/uaa/oauth/token",
  "zid": "382217ca-6332-4b03-85ee-8f**85fd903a",
  "aud": []
}

1 个答案:

答案 0 :(得分:0)

转到sap云平台,在您的子帐户内,您只需启用即可进行信任管理。您将看到您的角色引用,通过此操作,您将被授权访问该服务。