Les controles d’autorisation sont essentiels pour la securite des applications SAP. Avec AUTHORITY-CHECK, vous verifiez si un utilisateur dispose des autorisations requises pour une action.
Concept de base
| Terme | Description |
|---|---|
| Objet d’autorisation | Definit les champs verifiables (par ex. S_TCODE) |
| Champ d’autorisation | Champ individuel dans l’objet (par ex. TCD) |
| Autorisation | Valeurs concretes pour les champs |
| Role | Collection d’autorisations |
| Profil | Attribution technique a l’utilisateur |
Syntaxe
AUTHORITY-CHECK OBJECT 'OBJEKT_NAME" ID 'FELD1' FIELD wert1 ID 'FELD2' FIELD wert2 ID 'FELD3' DUMMY.
IF sy-subrc <> 0. " Pas d'autorisationENDIF.Exemples
1. Controle d’autorisation simple
" Verifier si l'utilisateur peut executer la transactionAUTHORITY-CHECK OBJECT 'S_TCODE" ID 'TCD' FIELD 'VA01'.
IF sy-subrc <> 0. MESSAGE e001(zmessages) WITH 'VA01'. " 'Vous n'avez pas l'autorisation pour la transaction VA01" RETURN.ENDIF.
" Executer la transactionCALL TRANSACTION 'VA01'.2. Verifier plusieurs champs
" Objet d'autorisation avec plusieurs champsAUTHORITY-CHECK OBJECT 'V_VBAK_VKO" ID 'VKORG' FIELD '1000' " Organisation commerciale ID 'VTWEG' FIELD '10' " Canal de distribution ID 'SPART' FIELD '00' " Division ID 'ACTVT' FIELD '02'. " Activite : Modifier
IF sy-subrc <> 0. MESSAGE e002(zmessages). " 'Pas d'autorisation pour cette organisation commerciale" RETURN.ENDIF.3. DUMMY pour les champs optionnels
" DUMMY = Le champ n'est pas verifieAUTHORITY-CHECK OBJECT 'M_BEST_BSA" ID 'ACTVT' FIELD '03' " Activite : Afficher ID 'BSART' DUMMY. " Le type de document n'est pas verifie
IF sy-subrc = 0. " L'utilisateur peut afficher tous les types de documentsENDIF.4. Codes d’activite (ACTVT)
" Activites standardCONSTANTS: c_actvt_create TYPE activ_auth VALUE '01', c_actvt_change TYPE activ_auth VALUE '02', c_actvt_display TYPE activ_auth VALUE '03', c_actvt_delete TYPE activ_auth VALUE '06', c_actvt_execute TYPE activ_auth VALUE '16'.
" Controle avec activiteDATA(lv_activity) = COND activ_auth( WHEN gv_mode = 'CREATE' THEN c_actvt_create WHEN gv_mode = 'CHANGE' THEN c_actvt_change ELSE c_actvt_display).
AUTHORITY-CHECK OBJECT 'Z_MYOBJECT" ID 'ACTVT' FIELD lv_activity ID 'ZFIELD' FIELD lv_value.
IF sy-subrc <> 0. CASE lv_activity. WHEN c_actvt_create. MESSAGE 'Pas d''autorisation pour creer' TYPE 'E'. WHEN c_actvt_change. MESSAGE 'Pas d''autorisation pour modifier' TYPE 'E'. WHEN OTHERS. MESSAGE 'Pas d''autorisation d''affichage' TYPE 'E'. ENDCASE.ENDIF.5. Creer une classe d’autorisation
CLASS zcl_authority_check DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF ty_auth_result, authorized TYPE abap_bool, message TYPE string, END OF ty_auth_result.
CLASS-METHODS: check_sales_org IMPORTING iv_vkorg TYPE vkorg iv_activity TYPE activ_auth RETURNING VALUE(rs_result) TYPE ty_auth_result.
CLASS-METHODS: check_transaction IMPORTING iv_tcode TYPE tcode RETURNING VALUE(rv_auth) TYPE abap_bool.
CLASS-METHODS: check_custom_object IMPORTING iv_field1 TYPE string iv_field2 TYPE string iv_activity TYPE activ_auth RETURNING VALUE(rv_auth) TYPE abap_bool.ENDCLASS.
CLASS zcl_authority_check IMPLEMENTATION. METHOD check_sales_org. AUTHORITY-CHECK OBJECT 'V_VBAK_VKO" ID 'VKORG' FIELD iv_vkorg ID 'VTWEG' DUMMY ID 'SPART' DUMMY ID 'ACTVT' FIELD iv_activity.
IF sy-subrc = 0. rs_result-authorized = abap_true. ELSE. rs_result-authorized = abap_false. rs_result-message = |Pas d'autorisation pour l'org. comm. { iv_vkorg }|. ENDIF. ENDMETHOD.
METHOD check_transaction. AUTHORITY-CHECK OBJECT 'S_TCODE" ID 'TCD' FIELD iv_tcode.
rv_auth = xsdbool( sy-subrc = 0 ). ENDMETHOD.
METHOD check_custom_object. AUTHORITY-CHECK OBJECT 'Z_CUSTOM_OBJ" ID 'ZFIELD1' FIELD iv_field1 ID 'ZFIELD2' FIELD iv_field2 ID 'ACTVT' FIELD iv_activity.
rv_auth = xsdbool( sy-subrc = 0 ). ENDMETHOD.ENDCLASS.
" UtilisationDATA(ls_auth) = zcl_authority_check=>check_sales_org( iv_vkorg = '1000" iv_activity = '02").
IF ls_auth-authorized = abap_false. MESSAGE ls_auth-message TYPE 'E'.ENDIF.6. Controle d’autorisation pour l’acces aux tables
" S_TABU_DIS - Autorisation de tableDATA: lv_table TYPE tabname VALUE 'KNA1'.
" Determiner le groupe d'autorisation de tableSELECT SINGLE cclass FROM tddat WHERE tabname = @lv_table INTO @DATA(lv_auth_group).
AUTHORITY-CHECK OBJECT 'S_TABU_DIS" ID 'DICBERCLS' FIELD lv_auth_group ID 'ACTVT' FIELD '03'. " Afficher
IF sy-subrc <> 0. MESSAGE |Pas d'autorisation pour la table { lv_table }| TYPE 'E'.ENDIF.7. Verifier les niveaux organisationnels
CLASS zcl_org_authority DEFINITION. PUBLIC SECTION. METHODS: check_org_levels IMPORTING is_org_data TYPE ty_org_data iv_activity TYPE activ_auth RETURNING VALUE(rv_auth) TYPE abap_bool.ENDCLASS.
CLASS zcl_org_authority IMPLEMENTATION. METHOD check_org_levels. " Societe AUTHORITY-CHECK OBJECT 'F_BKPF_BUK" ID 'BUKRS' FIELD is_org_data-bukrs ID 'ACTVT' FIELD iv_activity.
IF sy-subrc <> 0. rv_auth = abap_false. RETURN. ENDIF.
" Division AUTHORITY-CHECK OBJECT 'M_MATE_WRK" ID 'WERKS' FIELD is_org_data-werks ID 'ACTVT' FIELD iv_activity.
IF sy-subrc <> 0. rv_auth = abap_false. RETURN. ENDIF.
" Magasin AUTHORITY-CHECK OBJECT 'M_MATE_STO" ID 'WERKS' FIELD is_org_data-werks ID 'LGORT' FIELD is_org_data-lgort ID 'ACTVT' FIELD iv_activity.
rv_auth = xsdbool( sy-subrc = 0 ). ENDMETHOD.ENDCLASS.8. Controle d’autorisation avec journalisation
CLASS zcl_auth_with_logging DEFINITION. PUBLIC SECTION. METHODS: check_and_log IMPORTING iv_object TYPE xuobject iv_field TYPE string iv_value TYPE string iv_activity TYPE activ_auth RETURNING VALUE(rv_auth) TYPE abap_bool.
PRIVATE SECTION. METHODS: log_auth_failure IMPORTING iv_object TYPE xuobject iv_field TYPE string iv_value TYPE string iv_activity TYPE activ_auth.ENDCLASS.
CLASS zcl_auth_with_logging IMPLEMENTATION. METHOD check_and_log. " Controle d'autorisation dynamique AUTHORITY-CHECK OBJECT iv_object ID 'ACTVT' FIELD iv_activity ID iv_field FIELD iv_value.
IF sy-subrc = 0. rv_auth = abap_true. ELSE. rv_auth = abap_false. log_auth_failure( iv_object = iv_object iv_field = iv_field iv_value = iv_value iv_activity = iv_activity ). ENDIF. ENDMETHOD.
METHOD log_auth_failure. " Journalisation dans une table personnalisee INSERT INTO zauth_log VALUES @( VALUE #( timestamp = sy-datum && sy-uzeit user = sy-uname object = iv_object field = iv_field value = iv_value activity = iv_activity ) ).
" Ou Application Log " Voir : Application Logging ENDMETHOD.ENDCLASS.9. Verifier les autorisations pour BAPI
FUNCTION z_bapi_customer_change.*"----------------------------------------------------------------------*" IMPORTING*" VALUE(IV_KUNNR) TYPE KUNNR*" VALUE(IS_DATA) TYPE TY_CUSTOMER_DATA*" EXPORTING*" VALUE(ET_RETURN) TYPE BAPIRET2_T*"----------------------------------------------------------------------
" Controle d'autorisation AUTHORITY-CHECK OBJECT 'F_KNA1_BUK" ID 'BUKRS' FIELD is_data-bukrs ID 'ACTVT' FIELD '02'.
IF sy-subrc <> 0. APPEND VALUE bapiret2( type = 'E" id = 'ZMSG" number = '001" message = |Pas d'autorisation de modification pour la societe { is_data-bukrs }| message_v1 = is_data-bukrs ) TO et_return. RETURN. ENDIF.
" Modifier les donnees client...ENDFUNCTION.10. Verifier toutes les autorisations d’un objet
" Verifier toutes les valeurs pour lesquelles l'utilisateur est autoriseDATA: lt_values TYPE TABLE OF string.
" Determiner les organisations commerciales autoriseesSELECT vkorg FROM tvko INTO TABLE @DATA(lt_vkorg).
LOOP AT lt_vkorg INTO DATA(lv_vkorg). AUTHORITY-CHECK OBJECT 'V_VBAK_VKO" ID 'VKORG' FIELD lv_vkorg ID 'VTWEG' DUMMY ID 'SPART' DUMMY ID 'ACTVT' FIELD '03'.
IF sy-subrc = 0. APPEND lv_vkorg TO lt_values. ENDIF.ENDLOOP.
WRITE: / 'Organisations commerciales autorisees :'.LOOP AT lt_values INTO DATA(lv_val). WRITE: / lv_val.ENDLOOP.11. Analyser un objet d’autorisation avec SUIM
" Lire programmatiquement les autorisations d'un utilisateurDATA: lt_auth_values TYPE TABLE OF usvalues.
CALL FUNCTION 'SUSR_USER_AUTH_FOR_OBJ_GET" EXPORTING user_name = sy-uname sel_object = 'V_VBAK_VKO" TABLES values = lt_auth_values EXCEPTIONS user_name_not_exist = 1 not_authorized = 2 internal_error = 3 OTHERS = 4.
IF sy-subrc = 0. LOOP AT lt_auth_values INTO DATA(ls_auth). WRITE: / ls_auth-field, ls_auth-von, '-', ls_auth-bis. ENDLOOP.ENDIF.12. Definir son propre objet d’autorisation
" 1. Creer l'objet d'autorisation dans SU21 :" Nom : Z_ORDERS" Champs :" - ACTVT (Activite)" - ZREGION (champ personnalise)" - ZTYPE (champ personnalise)
" 2. Utilisation dans le code :AUTHORITY-CHECK OBJECT 'Z_ORDERS" ID 'ACTVT' FIELD '02' " Modifier ID 'ZREGION' FIELD 'EUROPE" ID 'ZTYPE' FIELD 'SALES'.
IF sy-subrc <> 0. MESSAGE 'Pas d''autorisation pour les commandes europeennes' TYPE 'E'.ENDIF.13. RAP : Controle d’autorisation dans la Behavior Definition
" Behavior Definitionmanaged implementation in class zbp_i_order unique;
define behavior for ZI_ORDER{ // Controle d'autorisation statique authorization master ( instance )
create; update; delete;}
" Behavior ImplementationCLASS lhc_order DEFINITION INHERITING FROM cl_abap_behavior_handler. PRIVATE SECTION. METHODS get_instance_authorizations FOR INSTANCE AUTHORIZATION IMPORTING keys REQUEST requested_authorizations RESULT result.ENDCLASS.
CLASS lhc_order IMPLEMENTATION. METHOD get_instance_authorizations. READ ENTITIES OF zi_order IN LOCAL MODE ENTITY order FIELDS ( region order_type ) WITH CORRESPONDING #( keys ) RESULT DATA(lt_orders).
LOOP AT lt_orders INTO DATA(ls_order). " Autorisation de modification IF requested_authorizations-%update = if_abap_behv=>mk-on. AUTHORITY-CHECK OBJECT 'Z_ORDERS" ID 'ACTVT' FIELD '02" ID 'ZREGION' FIELD ls_order-region ID 'ZTYPE' FIELD ls_order-order_type.
DATA(lv_update_auth) = COND #( WHEN sy-subrc = 0 THEN if_abap_behv=>auth-allowed ELSE if_abap_behv=>auth-unauthorized ). ENDIF.
" Autorisation de suppression IF requested_authorizations-%delete = if_abap_behv=>mk-on. AUTHORITY-CHECK OBJECT 'Z_ORDERS" ID 'ACTVT' FIELD '06" ID 'ZREGION' FIELD ls_order-region ID 'ZTYPE' FIELD ls_order-order_type.
DATA(lv_delete_auth) = COND #( WHEN sy-subrc = 0 THEN if_abap_behv=>auth-allowed ELSE if_abap_behv=>auth-unauthorized ). ENDIF.
APPEND VALUE #( %tky = ls_order-%tky %update = lv_update_auth %delete = lv_delete_auth ) TO result. ENDLOOP. ENDMETHOD.ENDCLASS.14. Test unitaire avec autorisations
CLASS ltcl_authority_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION. METHODS: test_auth_check FOR TESTING.ENDCLASS.
CLASS ltcl_authority_test IMPLEMENTATION. METHOD test_auth_check. " Tester le controle d'autorisation " Remarque : Dans le test unitaire, l'utilisateur executant " peut avoir des autorisations differentes
DATA(lv_auth) = zcl_authority_check=>check_transaction( 'SE38' ).
" Test dependant de l'autorisation reelle " Mieux : Utiliser un framework de mock ou des test doubles cl_abap_unit_assert=>assert_not_initial( act = lv_auth msg = 'Autorisation pour SE38 attendue" ). ENDMETHOD.ENDCLASS.15. Modele de securite pour les operations critiques
CLASS zcl_secure_operations DEFINITION. PUBLIC SECTION. METHODS: delete_customer IMPORTING iv_kunnr TYPE kunnr RAISING zcx_not_authorized zcx_business_error.
PRIVATE SECTION. METHODS: check_delete_authority IMPORTING iv_kunnr TYPE kunnr RAISING zcx_not_authorized.
METHODS: check_no_open_items IMPORTING iv_kunnr TYPE kunnr RAISING zcx_business_error.ENDCLASS.
CLASS zcl_secure_operations IMPLEMENTATION. METHOD delete_customer. " 1. Verifier l'autorisation check_delete_authority( iv_kunnr ).
" 2. Verifier les regles metier check_no_open_items( iv_kunnr ).
" 3. Effectuer la suppression DELETE FROM kna1 WHERE kunnr = @iv_kunnr. ENDMETHOD.
METHOD check_delete_authority. " Lire les donnees client pour les donnees org. SELECT SINGLE bukrs FROM knb1 WHERE kunnr = @iv_kunnr INTO @DATA(lv_bukrs).
AUTHORITY-CHECK OBJECT 'F_KNA1_BUK" ID 'BUKRS' FIELD lv_bukrs ID 'ACTVT' FIELD '06'. " Supprimer
IF sy-subrc <> 0. RAISE EXCEPTION TYPE zcx_not_authorized EXPORTING textid = zcx_not_authorized=>delete_not_allowed object = 'F_KNA1_BUK" value = lv_bukrs. ENDIF. ENDMETHOD.
METHOD check_no_open_items. " Verifier les postes ouverts SELECT COUNT(*) FROM bsid WHERE kunnr = @iv_kunnr INTO @DATA(lv_count).
IF lv_count > 0. RAISE EXCEPTION TYPE zcx_business_error EXPORTING textid = zcx_business_error=>open_items_exist. ENDIF. ENDMETHOD.ENDCLASS.Valeurs sy-subrc
| Valeur | Signification |
|---|---|
| 0 | Autorisation presente |
| 4 | Pas d’autorisation |
| 8 | Trop de champs specifies |
| 12 | Objet d’autorisation inexistant |
Objets d’autorisation importants
| Objet | Description |
|---|---|
S_TCODE | Autorisation de transaction |
S_TABU_DIS | Maintenance de table |
S_DEVELOP | Autorisation de developpement |
S_PROGRAM | Execution de programme |
F_BKPF_BUK | FI Societe |
M_MATE_WRK | MM Division |
V_VBAK_VKO | SD Organisation commerciale |
Remarques importantes / Bonnes pratiques
- Toujours verifier avant les operations critiques (modifier, supprimer).
- Utiliser DUMMY pour les champs non pertinents.
- Standardiser les activites (01=Creer, 02=Modifier, 03=Afficher, 06=Supprimer).
- Messages d’erreur explicites en cas d’autorisation manquante.
- Toujours verifier les niveaux organisationnels (societe, division, etc.).
- Creer des objets personnalises dans SU21 pour les exigences specifiques.
- Journalisation des echecs d’autorisation pour l’audit.
- Dans RAP, implementer les methodes Authorization Master.
- Effectuer des tests unitaires avec differents roles utilisateurs.
- Combinez avec les Classes d’exception pour une gestion structuree des erreurs.