Die AUTHORITY-CHECK
-Anweisung ist der zentrale Befehl in ABAP, um Berechtigungsprüfungen durchzuführen. Mit
dieser Anweisung überprüfst Du zur Laufzeit, ob der aktuell angemeldete Benutzer die notwendigen Berechtigungen
hat, um eine bestimmte Aktion auszuführen oder auf bestimmte Daten zuzugreifen.
Das SAP-System prüft dabei, ob die im Programmcode angeforderten Berechtigungen (definiert durch ein Berechtigungsobjekt
und spezifische Feldwerte) mit den Berechtigungen übereinstimmen, die dem Benutzer über seine Rollen im
Benutzerstammsatz (Transaktion SU01
, Rollenpflege PFCG
) zugewiesen wurden.
Konzept im Hintergrund (Kurz)
- Berechtigungsobjekte (SU21): Gruppieren bis zu 10 Berechtigungsfelder, die zusammen eine bestimmte Berechtigung
definieren (z. B. Objekt
F_BKPF_BUK
für Buchhaltungsbelege pro Buchungskreis, mit FeldernBUKRS
(Buchungskreis) undACTVT
(Aktivität)). - Berechtigungsfelder: Die einzelnen Kriterien innerhalb eines Objekts (z. B.
ACTVT
für Aktivität wie Anzeigen ’ 03’, Ändern ‘02’, Anlegen ‘01’). - Berechtigungen: Konkrete Ausprägungen im Benutzerstamm, die erlaubte Werte oder Muster für die Felder eines
Objekts definieren (z. B. darf Benutzer Müller im Objekt
F_BKPF_BUK
die Aktivität ‘03’ für Buchungskreis ‘1000’ ausführen). AUTHORITY-CHECK
: Vergleicht die im Code angeforderten Feld-Werte mit den im Benutzerstamm hinterlegten Berechtigungen für das angegebene Objekt.
Syntax
AUTHORITY-CHECK OBJECT '<Berechtigungsobjekt>' ID '<Feldname1>' FIELD <Wert1> ID '<Feldname2>' FIELD <Wert2> ... [ID '<FeldnameX>' DUMMY]. " Optional
" Unmittelbar nach der Prüfung MUSS sy-subrc ausgewertet werden:IF sy-subrc = 0. " Prüfung erfolgreich - Benutzer hat die Berechtigung(en). " Führe den geschützten Code aus...ELSE. " Prüfung fehlgeschlagen (sy-subrc <> 0) - Benutzer hat KEINE Berechtigung. " Gib eine Fehlermeldung aus, verlasse die Verarbeitung, etc.ENDIF.
OBJECT '<Berechtigungsobjekt>'
: (Obligatorisch) Der Name des Berechtigungsobjekts (ausSU21
) als Zeichenliteral, gegen das geprüft wird (z. B.'S_TCODE'
,'F_BKPF_BUK'
,'S_CARRID'
).ID '<Feldname>' FIELD <Wert>
: (Mindestens einID
-Zusatz, außer bei ausschließlicher Verwendung vonDUMMY
) Definiert ein Berechtigungsfeld des Objekts (z. B.'TCD'
,'BUKRS'
,'ACTVT'
) und den Wert (eine Variable oder ein Literal), auf den die Berechtigung des Benutzers geprüft werden soll. Du musst normalerweise für alle Felder des Objekts, die für Deine Prüfung relevant sind, einenID
/FIELD
-Zusatz angeben.ID '<Feldname>' DUMMY
: (Optional) Statt eines konkreten Wertes wird hier nur geprüft, ob der Benutzer irgendeine Berechtigung für dieses Feld im Kontext des Objekts besitzt. Dies wird manchmal verwendet, um zu prüfen, ob ein Objekt überhaupt im Benutzerprofil vorhanden ist, oder um z. B. auf eine Aktivität zu prüfen, ohne diese festzulegen (obwohl die Prüfung mit konkretemACTVT
-Wert üblicher ist). Wenn nurDUMMY
-Felder geprüft werden, prüft man im Grunde nur, ob der Benutzer das Objekt überhaupt in seinen Profilen hat.
Systemfeld sy-subrc
(Das Ergebnis der Prüfung)
Das Ergebnis des AUTHORITY-CHECK
musst Du immer direkt danach im Systemfeld sy-subrc
prüfen:
sy-subrc = 0
: Erfolg! Der Benutzer hat die angeforderte Berechtigung.sy-subrc = 4
: Keine Berechtigung. Dem Benutzer fehlt die passende Berechtigung für die geprüfte Kombination.sy-subrc = 12
: Kein Profil vorhanden. Der Benutzer hat kein Profil, das das geprüfte Berechtigungsobjekt enthält.sy-subrc = 8
: Berechtigung unvollständig (selten, tritt auf, wenn für weniger Felder eine Berechtigung existiert, als im Check angegeben wurden).- Andere Werte (16, 24, 28, 32, 36): Zeigen technische Probleme an (Benutzerpuffer fehlerhaft, Feldname im Check falsch, Objekt nicht im System etc.).
=> In der Praxis prüfst Du meist auf sy-subrc = 0
für Erfolg und behandelst alle anderen Fälle (sy-subrc <> 0
oder sy-subrc >= 4
) als “Berechtigung fehlt”.
Wo und Wann verwenden?
- Bevor Du dem Benutzer erlaubst, eine kritische Aktion auszuführen (Daten ändern, löschen, spezielle Programme starten).
- Bevor Du sensible Daten anzeigst.
- Wenn der Zugriff auf Daten oder Funktionen auf bestimmte Organisationseinheiten (Buchungskreis, Werk, Kostenstelle etc.) beschränkt werden soll.
- In Eigenentwicklungen (Z-Programme/Klassen), um sicherzustellen, dass Benutzer nur das tun dürfen, wofür sie
berechtigt sind. Standardtransaktionen und BAPIs enthalten oft schon eingebaute Berechtigungsprüfungen (siehe
SU24
zur Verknüpfung von T-Codes und Objekten).
Beispiele
1. Berechtigung für eine Transaktion prüfen
AUTHORITY-CHECK OBJECT 'S_TCODE' ID 'TCD' FIELD 'VA01'. " Darf der User VA01 starten?
IF sy-subrc <> 0. MESSAGE 'Du hast keine Berechtigung für Transaktion VA01.' TYPE 'E'. LEAVE PROGRAM.ENDIF.
2. Berechtigung zum Anzeigen von Finanzdaten für einen Buchungskreis
DATA lv_company_code TYPE bukrs.lv_company_code = '1000'. " Buchungskreis, für den geprüft wird
AUTHORITY-CHECK OBJECT 'F_BKPF_BUK' " Objekt für Buchhaltungsbeleg/Buchungskreis ID 'BUKRS' FIELD lv_company_code " Prüfe auf diesen Buchungskreis ID 'ACTVT' FIELD '03'. " Prüfe auf Aktivität 'Anzeigen'
IF sy-subrc <> 0. MESSAGE |Keine Anzeigeberechtigung für Buchungskreis { lv_company_code } vorhanden.| TYPE 'W'. RETURN. " Methode/Form verlassenENDIF.
" ... Code zum Anzeigen der Daten für lv_company_code ...
3. Prüfung mit DUMMY
(ob Objekt generell vorhanden ist)
" Prüfen, ob der Benutzer überhaupt irgendeine Berechtigung für Materialstämme hatAUTHORITY-CHECK OBJECT 'M_MATE_STA' ID 'ACTVT' DUMMY ID 'STATM' DUMMY.
IF sy-subrc = 12. " sy-subrc 12 = Kein Profil für das Objekt gefunden WRITE: / 'Benutzer hat generell keine Materialstamm-Berechtigung.'.ENDIF.
Wichtige Hinweise / Best Practice
- Werte
sy-subrc
immer direkt nachAUTHORITY-CHECK
aus. - Implementiere eine klare Fehlerbehandlung, wenn
sy-subrc <> 0
ist (z. B. Fehlermeldung ausgeben, Verarbeitung abbrechen). - Verwende Konstanten (z. B. über
CONSTANTS
) für die Namen der Berechtigungsobjekte und -felder, um Tippfehler zu vermeiden und die Wartbarkeit zu erhöhen. - Sprich Dich mit dem Berechtigungsmanagement Deines Unternehmens ab, welche Berechtigungsobjekte und Feldwerte für Deine Anwendung relevant sind und geprüft werden sollen.
- Prüfe alle relevanten Felder eines Objekts, die für die Sicherheit der Aktion notwendig sind (oft gehört
ACTVT
dazu).