Verificacion de autorizaciones en SAP con ABAP: Entendiendo AUTHORITY-CHECK

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

La sentencia AUTHORITY-CHECK es el comando central en ABAP para realizar verificaciones de autorizacion. Con esta sentencia verificas en tiempo de ejecucion si el usuario actualmente conectado tiene las autorizaciones necesarias para ejecutar una accion determinada o acceder a ciertos datos.

El sistema SAP verifica si las autorizaciones solicitadas en el codigo del programa (definidas por un objeto de autorizacion y valores de campo especificos) coinciden con las autorizaciones asignadas al usuario a traves de sus roles en el registro maestro de usuario (transaccion SU01, mantenimiento de roles PFCG).

Concepto basico (Resumen)

  • Objetos de autorizacion (SU21): Agrupan hasta 10 campos de autorizacion que juntos definen una autorizacion especifica (por ejemplo, objeto F_BKPF_BUK para documentos contables por sociedad, con campos BUKRS (sociedad) y ACTVT (actividad)).
  • Campos de autorizacion: Los criterios individuales dentro de un objeto (por ejemplo, ACTVT para actividad como Visualizar ‘03’, Modificar ‘02’, Crear ‘01’).
  • Autorizaciones: Valores concretos en el registro maestro del usuario que definen valores o patrones permitidos para los campos de un objeto (por ejemplo, el usuario Muller puede ejecutar en el objeto F_BKPF_BUK la actividad ‘03’ para la sociedad ‘1000’).
  • AUTHORITY-CHECK: Compara los valores de campo solicitados en el codigo con las autorizaciones almacenadas en el registro maestro del usuario para el objeto especificado.

Sintaxis

AUTHORITY-CHECK OBJECT '<Objeto_Autorizacion>'
ID '<NombreCampo1>' FIELD <Valor1>
ID '<NombreCampo2>' FIELD <Valor2>
...
[ID '<NombreCampoX>' DUMMY]. " Opcional
" Inmediatamente despues de la verificacion DEBES evaluar sy-subrc:
IF sy-subrc = 0.
" Verificacion exitosa - El usuario tiene la(s) autorizacion(es).
" Ejecuta el codigo protegido...
ELSE.
" Verificacion fallida (sy-subrc <> 0) - El usuario NO tiene autorizacion.
" Muestra un mensaje de error, abandona el procesamiento, etc.
ENDIF.
  • OBJECT '<Objeto_Autorizacion>': (Obligatorio) El nombre del objeto de autorizacion (de SU21) como literal de cadena, contra el que se verifica (por ejemplo, 'S_TCODE', 'F_BKPF_BUK', 'S_CARRID').
  • ID '<NombreCampo>' FIELD <Valor>: (Se requiere al menos un ID, excepto cuando se usa exclusivamente DUMMY) Define un campo de autorizacion del objeto (por ejemplo, 'TCD', 'BUKRS', 'ACTVT') y el valor (una variable o un literal) contra el cual se verificara la autorizacion del usuario. Normalmente debes especificar un ID/FIELD para todos los campos del objeto que sean relevantes para tu verificacion.
  • ID '<NombreCampo>' DUMMY: (Opcional) En lugar de un valor concreto, aqui solo se verifica si el usuario tiene alguna autorizacion para este campo en el contexto del objeto. Esto se usa a veces para verificar si un objeto existe en el perfil del usuario, o para verificar una actividad sin especificarla (aunque la verificacion con un valor concreto de ACTVT es mas comun). Si solo se verifican campos DUMMY, basicamente solo se verifica si el usuario tiene el objeto en sus perfiles.

Campo del sistema sy-subrc (El resultado de la verificacion)

El resultado del AUTHORITY-CHECK siempre debes verificarlo inmediatamente despues en el campo del sistema sy-subrc:

  • sy-subrc = 0: Exito! El usuario tiene la autorizacion solicitada.
  • sy-subrc = 4: Sin autorizacion. Al usuario le falta la autorizacion adecuada para la combinacion verificada.
  • sy-subrc = 12: No existe perfil. El usuario no tiene ningun perfil que contenga el objeto de autorizacion verificado.
  • sy-subrc = 8: Autorizacion incompleta (raro, ocurre cuando existe una autorizacion para menos campos de los especificados en la verificacion).
  • Otros valores (16, 24, 28, 32, 36): Indican problemas tecnicos (buffer de usuario defectuoso, nombre de campo incorrecto en la verificacion, objeto no existe en el sistema, etc.).

=> En la practica, normalmente verificas sy-subrc = 0 para exito y tratas todos los demas casos (sy-subrc <> 0 o sy-subrc >= 4) como “falta autorizacion”.

Donde y cuando usar?

  • Antes de permitir que el usuario ejecute una accion critica (modificar datos, eliminar, iniciar programas especiales).
  • Antes de mostrar datos sensibles.
  • Cuando el acceso a datos o funciones debe restringirse a ciertas unidades organizativas (sociedad, centro, centro de coste, etc.).
  • En desarrollos propios (programas/clases Z), para asegurar que los usuarios solo puedan hacer aquello para lo que estan autorizados. Las transacciones estandar y BAPIs a menudo ya contienen verificaciones de autorizacion integradas (ver SU24 para la vinculacion de T-Codes y objetos).

Ejemplos

1. Verificar autorizacion para una transaccion

AUTHORITY-CHECK OBJECT 'S_TCODE'
ID 'TCD' FIELD 'VA01'. " Puede el usuario iniciar VA01?
IF sy-subrc <> 0.
MESSAGE 'No tienes autorizacion para la transaccion VA01.' TYPE 'E'.
LEAVE PROGRAM.
ENDIF.

2. Autorizacion para visualizar datos financieros de una sociedad

DATA lv_company_code TYPE bukrs.
lv_company_code = '1000'. " Sociedad para la que se verifica
AUTHORITY-CHECK OBJECT 'F_BKPF_BUK' " Objeto para documento contable/sociedad
ID 'BUKRS' FIELD lv_company_code " Verificar para esta sociedad
ID 'ACTVT' FIELD '03'. " Verificar actividad 'Visualizar'
IF sy-subrc <> 0.
MESSAGE |No existe autorizacion de visualizacion para la sociedad { lv_company_code }.| TYPE 'W'.
RETURN. " Salir del metodo/form
ENDIF.
" ... Codigo para visualizar los datos de lv_company_code ...

3. Verificacion con DUMMY (si el objeto existe en general)

" Verificar si el usuario tiene alguna autorizacion para maestros de materiales
AUTHORITY-CHECK OBJECT 'M_MATE_STA'
ID 'ACTVT' DUMMY
ID 'STATM' DUMMY.
IF sy-subrc = 12. " sy-subrc 12 = No se encontro perfil para el objeto
WRITE: / 'El usuario no tiene autorizacion general para maestros de materiales.'.
ENDIF.

Notas importantes / Mejores practicas

  • Evalua sy-subrc siempre inmediatamente despues de AUTHORITY-CHECK.
  • Implementa un manejo de errores claro cuando sy-subrc <> 0 (por ejemplo, mostrar mensaje de error, cancelar procesamiento).
  • Usa constantes (por ejemplo, via CONSTANTS) para los nombres de objetos de autorizacion y campos, para evitar errores de escritura y mejorar el mantenimiento.
  • Coordina con la gestion de autorizaciones de tu empresa que objetos de autorizacion y valores de campo son relevantes para tu aplicacion y deben verificarse.
  • Verifica todos los campos relevantes de un objeto que sean necesarios para la seguridad de la accion (frecuentemente ACTVT esta incluido).