본문 바로가기
ABAP/Function|Class

[Class] CL_AUTH_OBJECTS_TO_SQL - 사용자의 보유 권한으로 SQL 조건문 생성

by name_text 2024. 10. 29.

CL_AUTH_OBJECTS_TO_SQL

사용자의 보유 권한으로 SQL 조건문 생성

 

CBO 프로그램에서 사용자가 보유한 권한에 해당 하는 데이터만 조회하기 위해 기존에는 range를 이용하여 권한이 있는 조직 데이터를 만들어 쿼리문을 처리하였는데,

 

비교적 간단하게 권한오브젝트에 대해 사용자의 보유권한을 이용하여 조건문을 자동으로 생성해 주는 Class가 있어서 정리해 봤습니다.

 

권한을 점검하고자 하는 오브젝트와 권한값 을 넣으면 해당하는 조직정보나 문서유형 같은 값들을 SQL 조건문으로 만들어 줍니다.

 

적절하게 활용하면 CBO 프로그램의 권한 제어에 상당히 효율적으로 보입니다.

 

# 사용예시

  "데이터 조회시 권한 점검 포함
  DATA(lv_where_clause) = VALUE string( ).

  DATA(lo_auth_check) = cl_auth_objects_to_sql=>create_for_open_sql( ).
  lo_auth_check->add_authorization_object(
    EXPORTING iv_authorization_object = 'V_VBAK_VKO'
              it_activities           = VALUE #( ( auth_field = 'ACTVT'   value = '03' ) )
              it_field_mapping        = VALUE #( ( auth_field = 'VKORG'
                                                   view_field = VALUE #( table_ddic_name = 'VBAK'   table_alias = 'A'   field_name = 'VKORG' ) ) ) ).
  lo_auth_check->add_authorization_object(
    EXPORTING iv_authorization_object = 'F_BKPF_BUK'
              it_activities           = VALUE #( ( auth_field = 'ACTVT'   value = '03' ) )
              it_field_mapping        = VALUE #( ( auth_field = 'BUKRS'
                                                   view_field = VALUE #( table_ddic_name = 'VBAK'   table_alias = 'A'   field_name = 'BUKRS_VF' ) ) ) ).
  lo_auth_check->add_authorization_object(
    EXPORTING iv_authorization_object = 'M_MATE_WRK'
*              it_activities           = VALUE #( ( auth_field = 'ACTVT'   value = '03' ) )
              it_field_mapping        = VALUE #( ( auth_field = 'WERKS'
                                                   view_field = VALUE #( table_ddic_name = 'VBAP'   table_alias = 'A2'  field_name = 'WERKS' ) ) ) ).

  TRY.
      lv_where_clause = lo_auth_check->get_sql_condition( ).
    CATCH cx_auth_not_authorized.
      MESSAGE 'No Auth' TYPE 'I' DISPLAY LIKE 'E'.
      EXIT.
  ENDTRY.

  IF lv_where_clause IS INITIAL.
    lv_where_clause = @ABAP_TRUE EQ @ABAP_TRUE.
  ENDIF.

  SELECT
    a~vbeln,
    a~erdat,
    a~erzet,
    a~ernam,
    a~vkorg,
    a~vtweg,
    a~vkbur,
    a~bukrs_vf,
    a2~posnr,
    a2~werks,
    a2~lgort,
    a2~matnr,
    a2~arktx
  FROM vbak AS a
    INNER JOIN vbap AS a2 ON a~vbeln EQ a2~vbeln
    INNER JOIN t001 AS b ON a~bukrs_vf EQ b~bukrs
    INNER JOIN t001w AS c ON a2~werks EQ c~werks
  WHERE (lv_where_clause)       "권한이 있는 필드값을 조건문에 추가
    AND a~vkorg IN @s_vkorg
    AND b~bukrs EQ @p_bukrs
    AND c~werks IN @s_werks
    AND a~erdat IN @s_erdat
  INTO TABLE @DATA(lt_result).

  cl_demo_output=>new(
    )->next_section( '보유한 권한에 따라 아래 조건문으로 데이터가 필터링 됩니다' )->write( lv_where_clause
    )->next_section( '조회 결과' )->write( lt_result
    )->display( ).
ABAP

 

댓글