Ansicht
Dokumentation

CL_RBAM_RESTRICTIONS_API - RBAM: API für Instanz-Einschränkungen

CL_RBAM_RESTRICTIONS_API - RBAM: API für Instanz-Einschränkungen

Vendor Master (General Section)   SUBST_MERGE_LIST - merge external lists to one complete list with #if... logic for R3up  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

Funktionalität

Konzept

Zugriffe auf Business Objekte (BOs) der Enterprise Service Infrastructure (ESI) unterliegen grundsätzlich einer Berechtigungsprüfung. Diese Berechtigungsprüfung wird von der ESI-Laufzeitumgebung automatisch und immer durchgeführt. Zu diesem Zweck verwendet die ESI-Laufzeitumgebung das sog. Role Based Access Management (RBAM). RBAM ist eine Infrastruktur zur Prüfung von Berechtigungen (zur Laufzeit), als auch zur Definition und Auslieferung entsprechender Berechtigungsprofile (in der Regel zur Entwicklungszeit).

Da die Berechtigungsprüfung für BOs automatisch stattfindet, müssen Anwendungen, insbesondere der ABAP-Programmcode von Business Objekten oder UI Controller-Objekten, keinerlei API aufrufen, um einen Schutz der Business Objekte sicherzustellen. Dies gilt auch und insbesondere für Suchanfragen (Queries) von Business Objekten. Für diese Suchanfragen findet automatisch eine Filterung der Suchergebnisse anhand der Benutzerberechtigungen statt, so dass Benutzer in jedem Fall nur Suchergebnisse erhalten, für die sie die notwendigen Berechtigungen besitzen. Die automatisch Filterung arbeitet dabei so, dass alle Suchergebnisse zurückgegeben werden, für die der Benutzer Leseberechtigung hat, und zwar unabhängig vom Kontext, für den diese Leseberechtigung vergeben wurde.

RBAM ermöglicht aber durchaus, Berechtigungen kontextspezifisch zu vergeben. Zu diesem Zweck kann eine Berechtigung (RBAM Rule) in einem Berechtigungsprofil (RBAM Policy) auf einen Berechtigungskontext (RBAM Access Context) eingeschränkt werden. Der Berechtigungskontext stellt dabei einen anwendungsseitig definierten Schlüsselbegriff für einen betriebswirtschaftlichen Aufgabenbereich dar. Kennzeichnend für einen solchen Aufgabenbereich ist das Vorhandensein einer eigenen Zuständigkeitsfindung für diesen Aufgabenbereich. Die Liste der definierten Berechtigungskontexte kann über den Pflege-View RBAMCTXPROV in Transaktion SM30 angezeigt werden. Technisch wirkt sich die Einschränkung einer Berechtigung auf einen Berechtigungskontext auf zwei Arten aus:

  • Es findet allein aufgrund der Einschränkung der Berechtigung auf einen Kontext bereits eine Einschränkung der Instanzmenge statt. Die Berechtigung gilt nur noch für Instanzen, für die eine Zuständigkeitsfindung im betreffenden Berechtigungskontext stattgefunden hat, und das Ergebnis der Zuständigkeitsfindung in der Zugriffskontrollliste (RBAM Access Control List) der BO-Instanz abgespeichert wurde.
  • Die Einschränkung der Berechtigung auf einen Kontext ist Voraussetzung für die weitere Einschränkung der Berechtigung auf eine sog. RBAM Instanzengruppe (Access Group) im Rahmen der Berechtigungsadministration zur Laufzeit. Diese Einschränkungen können pro Benutzer-Rollen-Zuordnung vorgenommen werden, und gelten damit für alle in der Rolle enthaltenen, kontextspezifischen Berechtigungen. Bspw. kann eine Rolle mit Berechtigungen im Kontext 'Personnel Administration' auf eine Personalabteilung eingeschränkt werden. Die Auswirkung einer solchen Einschränkung ist, dass der Benutzer, dessen Rollenzuordnung wie beschrieben eingeschränkt wurde, die Berechtigungen der Rolle nur noch für solche BO-Instanzen ausüben kann, für die laut Zuständigkeitsfindung die betreffende Personalabteilung zuständig ist.

Anwendungsmöglichkeiten

Die vorliegende Klasse CL_RBAM_RESTRICTIONS_API, im folgenden auch "RBAM Restrictions API" genannt, bietet Anwendungen, insbesondere Verwendern von BO-Suchanfragen (Query Consumer), eine Möglichkeit, die automatisch stattfindende Berechtigungsfilterung von BO-Suchanfragen noch weiter zu verfeinern, und dadurch quasi freiwillig auf Suchergebnisse zu verzichten, für die der Benutzer zwar Berechtigungen besitzt, deren Rückgabe aber im jeweiligen Anwendungskontext aus betriebswirtschaftlichen Gründen nicht gewünscht ist. Anwendungen können mit der API u.a. folgende Aspekte der Standardfilterung variieren:

  • Die Filterung kann eine andere als die Leseberechtigung prüfen. Bspw. kann die Anwendung eine Filterung anfordern, bei der nur solche Suchergebnisse zurückgegeben werden, für die der Benutzer Änderungsberechtigung hat.
  • Die Filterung kann auf Berechtigungen eingeschränkt werden, die für einen bestimmten Kontext vergeben wurden. Bspw. kann die Anwendung eine Filterung anfordern, bei der nur solche Suchergebnisse zurückgegeben werden, für die der Benutzer Leseberechtigungen im Kontext 'Employee Self Services' hat. Selbst wenn der Benutzer aufgrund von Berechtigungen in anderen Kontexten (z.B. 'Personnel Administration'), die ihm ebenfalls zugeordnet sind, auf zusätzliche Suchergebnisse prinzipiell zugreifen dürfte, werden diese dann bei der aktuellen Suchanfrage nicht zurückgegeben.

Die Klasse CL_RBAM_RESTRICTIONS_API bietet z.Zt. nur eine einzige öffentliche Methode, GET_RESTRICTIONS_ESF. Weitere Details zu Parametern und Funktionsweise dieser Methode befinden sich in der separaten Methodendokumentation.

Beziehungen

Übergabe des Berechtigungsfilters

Damit die von den Methoden von CL_RBAM_RESTRICTIONS_API zurückgegebenen Datenstrukturen tatsächlich als Berechtigungsfilter angewendet werden, müssen sie vom Query Consumer programmatisch an die Implementierung einer BO-Suchanfrage (Query Provider) übergeben werden. Bei einem Aufruf der Suchanfrage mit Hilfe des ESI Local Client Proxy (LCP) erfolgt dies bspw. durch Übertragen der Rückgabewerte von CL_RBAM_RESTRICTIONS_API=>GET_RESTRICTIONS_ESF in die namensgleichen Strukturkomponenten des optionalen Importing-Parameters IN_AUTHORIZATION_CONTEXT der Methode IF_ESF_LCP->QUERY. Zusätzlich muss der Query Consumer die Strukturkomponente IN_AUTHORIZATION_CONTEXT-IS_FILLED auf 'X' (oder auf die vordefinierte Konstante abap_true) setzen, damit der Berechtigungsfilter tatsächlich verwendet wird (siehe Programmbeispiel).

Angabe der zu prüfenden Berechtigung (Operation)

Query Consumer können bei der Abfrage des Berechtigungsfilters mit CL_RBAM_RESTRICTIONS_API=>GET_RESTRICTIONS_ESF die Berechtigung (im Sinne von die Operation) angeben, welche der Benutzer auf jedem Suchergebnis haben muss. Diese Operation muss in Form von Operationstyp und Operationsname angegeben werden. Für die Liste der möglichen Operationstypen, sowie teilweise für die Liste der möglichen Operationsnamen, stehen Konstanten der Schnittstelle IF_RBAM_ESF_CONSTANTS zur Verfügung. Siehe dazu die Klassendokumentation von IF_RBAM_ESF_CONSTANTS sowie u.a. Programmbeispiel.

Interpretation des Berechtigungsfilters

In der Regel ist seitens des Query Consumer außer der Übergabe des Berechtigungsfilters von CL_RBAM_RESTRICTIONS_API=>GET_RESTRICTIONS_ESF an den Query Provider keinerlei weitergehende Verwendung des Berechtigungsfilters notwendig. Insbesondere ist keine Interpretation der Semantik des Berechtigungsfilters seitens des Query Consumers notwendig. Seitens des Query Provider, sowie in wenigen Ausnahmefällen seitens generischer Query Consumer, kann jedoch ein Interpretation des Berechtigungsfilters sinnvoll sein. Zu diesem Zweck kann die Hilfsklasse CL_RBAM_QUERY_UTILS verwendet werden. Siehe dazu deren separate Klassendokumentation.

Paketschnittstelle

Zur Verwendung der RBAM Restrictions API und zugehöriger Funktionalität müssen Pakete eine Abhängigkeit von der Paketschnittstelle SRBAM_RESTRICTIONS des Strukturpakets BASIS deklarieren.

Beispiel

*&---------------------------------------------------------------------*
*& Report  Z_RBAM_RESTRICTIONS_DEMO
*&
*&---------------------------------------------------------------------*
*&             Role Based Access Management (RBAM):
*& Sample program to illustrate usage of the RBAM Restrictions API
*&---------------------------------------------------------------------*

REPORT  z_rbam_restrictions_demo.

*&---------------------------------------------------------------------*
*&      Form  main
*&---------------------------------------------------------------------*
* Performs queries of business object ESA_SAMPLE_SALES_ORDER using
* custom filtering of query results according to RBAM restrictions.
*----------------------------------------------------------------------*
FORM main
  RAISING cx_static_check cx_dynamic_check.

  DATA:
    lr_lcp_facade            TYPE REF TO if_esf_lcp_facade,
    lr_lcp                   TYPE REF TO if_esf_lcp,
    ls_operation             TYPE rbam_esf_operation_s,
    ls_authorization_context TYPE if_esf_types=>ty_authorization_context,
    lt_node_ids              TYPE sesf_bo_node_id_tab,
    lt_messages              TYPE if_esf_types=>ty_messages.

* Get local client proxy for business object ESA_SAMPLE_SALES_ORDER
  lr_lcp_facade = cl_esf_lcp_factory=>get_lcp_transaction_handler( ).
  lr_lcp = lr_lcp_facade->get_lcp(
   in_bo_name = if_esa_sample_sales_order=>co_bo_name
  ).

* Always set this flag to abap_true ('X') in data objects that will be
* passed as importing parameter IN_AUTHORIZATION_CONTEXT to LCP queries
  ls_authorization_context-is_filled = abap_true.

************************* Example 1 ***********************************

* Get RBAM restrictions for query results that the current user (SY-UNAME)
* is allowed to read (IF_RBAM_ESF_CONSTANTS=>CO_OPERATION_PATTERN_RETRIEVE)
* in any access context (if_access_context is initial).
  cl_rbam_restrictions_api=>get_restrictions_esf(
    EXPORTING
      if_bo_name            = if_esa_sample_sales_order=>co_bo_name
      if_bo_node_name       = if_esa_sample_sales_order=>co_bo_node-root
*     is_operation          = IF_RBAM_ESF_CONSTANTS=>CO_OPERATION_PATTERN_RETRIEVE
*     if_user               = SY-UNAME
*     if_access_context     =
    IMPORTING
      ef_grant_rule_found   = ls_authorization_context-grant_rule_found
      et_grant_restrictions = ls_authorization_context-grant_restrictions
      ef_deny_rule_found    = ls_authorization_context-deny_rule_found
      et_deny_restrictions  = ls_authorization_context-deny_restrictions
  ).

  lr_lcp->query(
    EXPORTING
      in_bo_node_name          = if_esa_sample_sales_order=>co_bo_node-root
      in_query_name            = if_esa_sample_sales_order=>co_query-root-header
*     in_filter_node_ids       =
*     in_query_options         =
*     in_selection_parameters  =
      in_authorization_context = ls_authorization_context
*     in_fill_data             = SPACE
    IMPORTING
*     out_query_info           =
      out_node_ids             = lt_node_ids
*     out_data                 =
      out_messages             = lt_messages
  ).

* Display some information about query execution
  PERFORM display_query_results
    USING
      'SOs current user is allowed to READ in any access context'
      lt_node_ids
      lt_messages.

************************* Example 2 ***********************************

* Get RBAM restrictions for query results that the current user (SY-UNAME)
* is allowed to save (IF_RBAM_ESF_CONSTANTS=>CO_OPERATION_PATTERN_SAVE)
* in any access context (if_access_context is initial).
  cl_rbam_restrictions_api=>get_restrictions_esf(
    EXPORTING
      if_bo_name            = if_esa_sample_sales_order=>co_bo_name
      if_bo_node_name       = if_esa_sample_sales_order=>co_bo_node-root
      is_operation          = if_rbam_esf_constants=>co_operation_pattern_save
*     if_user               = SY-UNAME
*     if_access_context     =
    IMPORTING
      ef_grant_rule_found   = ls_authorization_context-grant_rule_found
      et_grant_restrictions = ls_authorization_context-grant_restrictions
      ef_deny_rule_found    = ls_authorization_context-deny_rule_found
      et_deny_restrictions  = ls_authorization_context-deny_restrictions
  ).

  lr_lcp->query(
    EXPORTING
      in_bo_node_name          = if_esa_sample_sales_order=>co_bo_node-root
      in_query_name            = if_esa_sample_sales_order=>co_query-root-header
*     in_filter_node_ids       =
*     in_query_options         =
*     in_selection_parameters  =
      in_authorization_context = ls_authorization_context
*     in_fill_data             = SPACE
    IMPORTING
*     out_query_info           =
      out_node_ids             = lt_node_ids
*     out_data                 =
      out_messages             = lt_messages
  ).

* Display some information about query execution
  PERFORM display_query_results
    USING
      'SOs current user is allowed to SAVE in any access context'
      lt_node_ids
      lt_messages.

************************* Example 3 ***********************************

* Get RBAM restrictions for query results that the current user (SY-UNAME)
* is allowed to read (IF_RBAM_ESF_CONSTANTS=>CO_OPERATION_PATTERN_RETRIEVE)
* in access context ESM1.
  cl_rbam_restrictions_api=>get_restrictions_esf(
    EXPORTING
      if_bo_name            = if_esa_sample_sales_order=>co_bo_name
      if_bo_node_name       = if_esa_sample_sales_order=>co_bo_node-root
*     is_operation          = IF_RBAM_ESF_CONSTANTS=>CO_OPERATION_PATTERN_RETRIEVE
*     if_user               = SY-UNAME
      if_access_context     = 'ESM1'
    IMPORTING
      ef_grant_rule_found   = ls_authorization_context-grant_rule_found
      et_grant_restrictions = ls_authorization_context-grant_restrictions
      ef_deny_rule_found    = ls_authorization_context-deny_rule_found
      et_deny_restrictions  = ls_authorization_context-deny_restrictions
  ).

  lr_lcp->query(
    EXPORTING
      in_bo_node_name          = if_esa_sample_sales_order=>co_bo_node-root
      in_query_name            = if_esa_sample_sales_order=>co_query-root-header
*     in_filter_node_ids       =
*     in_query_options         =
*     in_selection_parameters  =
      in_authorization_context = ls_authorization_context
*     in_fill_data             = SPACE
    IMPORTING
*     out_query_info           =
      out_node_ids             = lt_node_ids
*     out_data                 =
      out_messages             = lt_messages
  ).

* Display some information about query execution
  PERFORM display_query_results
    USING
      'SOs current user is allowed to READ in access context ESM1'
      lt_node_ids
      lt_messages.

************************* Example 4 ***********************************

* Get RBAM restrictions for query results that the current user (SY-UNAME)
* is allowed to perform the action 'CONFIRM_INVOICE' (ls_operation) on
* in access context ESM1.

  ls_operation-type = if_rbam_esf_constants=>co_op_type_action.
  ls_operation-pname = if_esa_sample_sales_order=>co_action-root-confirm_invoice.

  cl_rbam_restrictions_api=>get_restrictions_esf(
    EXPORTING
      if_bo_name            = if_esa_sample_sales_order=>co_bo_name
      if_bo_node_name       = if_esa_sample_sales_order=>co_bo_node-root
      is_operation          = ls_operation
*     if_user               = SY-UNAME
      if_access_context     = 'ESM1'
    IMPORTING
      ef_grant_rule_found   = ls_authorization_context-grant_rule_found
      et_grant_restrictions = ls_authorization_context-grant_restrictions
      ef_deny_rule_found    = ls_authorization_context-deny_rule_found
      et_deny_restrictions  = ls_authorization_context-deny_restrictions
  ).

  lr_lcp->query(
    EXPORTING
      in_bo_node_name          = if_esa_sample_sales_order=>co_bo_node-root
      in_query_name            = if_esa_sample_sales_order=>co_query-root-header
*     in_filter_node_ids       =
*     in_query_options         =
*     in_selection_parameters  =
      in_authorization_context = ls_authorization_context
*     in_fill_data             = SPACE
    IMPORTING
*     out_query_info           =
      out_node_ids             = lt_node_ids
*     out_data                 =
      out_messages             = lt_messages
  ).

* Display some information about query execution
  PERFORM display_query_results
    USING
      'SOs current user is allowed to confirm invoices for in access context ESM1'
      lt_node_ids
      lt_messages.
ENDFORM.                    "main

*&---------------------------------------------------------------------*
*&      Form  display_query_results
*&---------------------------------------------------------------------*
* Displays short summary about query results
*----------------------------------------------------------------------*
*      -->IF_QUERY_DESCRIPTION  Text describing the query performed
*      -->IT_NODE_IDS           Node IDs returned by that query
*      -->IT_MESSAGES           Messages returned by that query
*----------------------------------------------------------------------*
FORM display_query_results
  USING
    if_query_description TYPE string
    it_node_ids          TYPE sesf_bo_node_id_tab
    it_messages          TYPE if_esf_types=>ty_messages.

  DATA:
      lr_message             LIKE LINE OF it_messages,
      lf_num_results         TYPE i,
      lf_text                TYPE string.

  lf_num_results = lines( it_node_ids ).

  WRITE: / if_query_description, ':', 80 lf_num_results, 'node IDs returned'.

  IF it_messages IS NOT INITIAL.
    WRITE: / 'Messages from query provider:'.
    LOOP AT it_messages INTO lr_message.
      lf_text = lr_message->get_text( ).
      WRITE: / lf_text.
    ENDLOOP.
  ENDIF.
ENDFORM.                    "print_query_results

START-OF-SELECTION.
  PERFORM main.


Hinweise

Weiterführende Informationen






General Data in Customer Master   RFUMSV00 - Advance Return for Tax on Sales/Purchases  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 27565 Date: 20240419 Time: 202413     sap01-206 ( 248 ms )