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_BUKpara documentos contables por sociedad, con camposBUKRS(sociedad) yACTVT(actividad)). - Campos de autorizacion: Los criterios individuales dentro de un objeto (por ejemplo,
ACTVTpara 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_BUKla 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 (deSU21) 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 unID, excepto cuando se usa exclusivamenteDUMMY) 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 unID/FIELDpara 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 deACTVTes mas comun). Si solo se verifican camposDUMMY, 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
SU24para 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/formENDIF.
" ... 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 materialesAUTHORITY-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-subrcsiempre inmediatamente despues deAUTHORITY-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
ACTVTesta incluido).