ACL

El paquete APEX_ACL proporciona utilidades que puede utilizar al programar en el entorno de Oracle Application Express relacionado con los componentes compartidos de control de acceso a aplicaciones.

Puede usar el paquete APEX_ACL para agregar, eliminar o reemplazar roles de usuario. También puede aprovechar el trigger INSTEAD OF en la vista APEX_APPL_ACL_USERS para editar roles de usuario con instrucciones DML (INSERTAR, ACTUALIZAR y ELIMINAR).

Si desea usar el paquete fuera de un entorno de Oracle APEX, el security_group_id debe configurarse mediante APEX_UTIL.SET_WORKSPACE o APEX_UTIL.SET_SECURITY_GROUP_ID antes de poder utilizarlo.

Utilice las vistas APEX relacionadas para obtener más información sobre los usuarios de la aplicación y los roles. Estas vistas son: APEX_APPL_ACL_ROLES, APEX_APPL_ACL_USER_ROLES y APEX_APPL_ACL_USERS.

Los componentes de este paquete son:

Procedimiento ADD_USER_ROLE (Sign. 1)

Se utiliza para asignar un rol a un usuario. Su sintaxis es:

APEX_ACL.ADD_USER_ROLE (
    p_application_id  IN NUMBER DEFAULT apex_application.g_flow_id,
    p_user_name       IN VARCHAR2,
    p_role_id         IN NUMBER );

Donde, p_application_id es el identificador de la aplicación a la que se asignará el rol,
p_user_name es el nombre del usuario y,
p_role_id es el identificador del rol a asignar.

Por ejemplo:

begin
    APEX_ACL.ADD_USER_ROLE (
        p_application_id => 255,
        p_user_name      => 'SCOTT',
        p_role_id        => 2505704029884282 );
end;
Procedimiento ADD_USER_ROLE (Sign. 2)

Al igual que el procedimiento anterior, asigna un rol a un usuario, utilizando la sintaxis:

APEX_ACL.ADD_USER_ROLE (
    p_application_id IN NUMBER  DEFAULT apex_application.g_flow_id,
    p_user_name      IN VARCHAR2,
    p_role_static_id IN VARCHAR2 );

Donde, p_application_id es el identificador de la aplicación a la que se asignará el rol,
p_user_name es el nombre del usuario y,
p_role_static es el nombre del rol a asignar.
Por ejemplo:

begin
    APEX_ACL.ADD_USER_ROLE (
        p_application_id => 255,
        p_user_name      => 'SCOTT',
        p_role_static_id => 'ADMINISTRATOR' );
end;
Función HAS_USER_ANY_ROLES

Esta función verifica si el usuario tiene asignado algún rol, en cuyo caso retorna TRUE, de lo contrario, retorna FALSE. Puede ser utilizada para determinar si un usuario puede acceder a una aplicación. Su sintaxis es:

APEX_ACL.HAS_USER_ANY_ROLES (
    p_application_id IN NUMBER   DEFAULT apex_application.g_flow_id,
    p_user_name      IN VARCHAR2 DEFAULT apex_application.g_user )
    RETURN boolean;

Donde, p_application_id es el identificador de la aplicación,
p_user_name es el nombre del usuario. Por ejemplo:

DECLARE
    l_has_user_any_roles boolean := false;
BEGIN
    l_has_user_any_roles := APEX_ACL.HAS_USER_ANY_ROLES (
                              p_application_id  => 255,
                              p_user_name       => 'SCOTT' );

    IF NOT l_has_user_any_roles THEN
        raise_application_error(-20001, 'Scott no tiene asignado ningún rol de aplicación' );
    END IF;
END;
Función HAS_USER_ROLE

Esta función verifica si un usuario tiene asignado un rol específico, en cuyo caso retorna TRUE, de lo contrario retorna FALSE. Utiliza la sintaxis:

APEX_ACL.HAS_USER_ROLE (
    p_application_id IN NUMBER   default apex_application.g_flow_id,
    p_user_name      IN VARCHAR2 default apex_application.g_user,
    p_role_static_id IN VARCHAR2 )
    return boolean;

Donde p_application_id es el identificador de la aplicación,
p_user_name es el nombre de usuario, y
p_role_static es el nombre del rol. Por ejemplo:

declare
    l_is_admin boolean := false;
begin
    l_is_admin := APEX_ACL.HAS_USER_ROLE (
                    p_application_id  => 255,
                    p_user_name       => 'SCOTT',
                    p_role_static_id  => 'ADMINISTRATOR' );

    if not l_is_admin then
        raise_application_error(-20001, 'Scott NO es un administrador' );
    end if;
end;
Función IS_ROLE_REMOVED_FROM_USER

Esta función verifica si un rol ha sido removido de un usuario. Retorna TRUE si un rol específico ha sido removido de una lista de nuevos IDs para el usuario. Su sintaxis es:

APEX_ACL.IS_ROLE_REMOVED_FROM_USER (
    p_application_id    IN NUMBER       DEFAULT apex_application.g_flow_id,
    p_user_name         IN VARCHAR2,
    p_role_static_id    IN VARCHAR2,
    p_role_ids          IN apex_t_number )
    RETURN BOOLEAN;

Donde, p_application_id es el identificador de la aplicación,
p_user_name es el nombre de usuario,
p_role_static_id es el nombre del rol que se va a verificar y,
p_role_ids es la lista de identificadores de nuevos roles asignados al usuario.

Por ejemplo:

DECLARE
    is_role_removed boolean := false;
BEGIN
    is_role_removed := apex_acl.is_role_removed_from_user (
                         p_application_id => 255,
                         p_user_name => 'SCOTT',
                         p_role_static_id => 'ADMINISTRATOR',
                         p_role_ids => apex_t_number( 2505704029884282, 345029884282 ) );

    IF NOT is_role_removed THEN
        raise_application_error(-20001, 'ADMINISTRATOR role is not removed from SCOTT.' );
    END IF;
END;
Procedimiento REMOVE_USER_ROLE (Sign. 1)

Este procedimiento remueve un rol que ha sido asignado a un usuario. Su sintaxis es:

APEX_ACL.REMOVE_USER_ROLE (
    p_application_id IN NUMBER   DEFAULT apex_application.g_flow_id,
    p_user_name      IN VARCHAR2,
    p_role_id        IN NUMBER );

Donde, p_application_id es el identificador de la aplicación,
p_user_name es el nombre del usuario y,
p_role_id es el número de identificador del rol a remover.

Por ejemplo:

begin
    APEX_ACL.REMOVE_USER_ROLE (
        p_application_id => 255,
        p_user_name      => 'SCOTT',
        p_role_id        => 2505704029884282 );
end;
Procedimiento REMOVE_USER_ROLE (Sign. 2)

Al igual que en el caso anterior, este procedimiento remueve un rol de un usuario y utiliza la sintaxis:

APEX_ACL.REMOVE_USER_ROLE (   
        p_application_id IN NUMBER   DEFAULT apex_application.g_flow_id,   
        p_user_name      IN VARCHAR2,   
        p_role_static_id IN VARCHAR2 );

Donde, p_application_id es el identificador de la aplicación,
p_user_name es el nombre del usuario y,
p_role_static_id es el nombre del rol a remover del usuario.

Por ejemplo:

begin
    APEX_ACL.REMOVE_USER_ROLE (
        p_application_id => 255,
        p_user_name => 'SCOTT',
        p_role_static_id => 'ADMINISTRATOR' );
end;
Procedimiento REPLACE_USER_ROLES (Sign. 1)

Este procedimiento reemplaza cualquier lista de roles asignados a un usuario por la nueva matriz de roles, usando la sintaxis:

APEX_ACL.REPLACE_USER_ROLES (
    p_application_id IN NUMBER   DEFAULT apex_application.g_flow_id,
    p_user_name      IN VARCHAR2,
    p_role_ids       IN apex_t_number );

Donde, p_application_id es el identificador de la aplicación,
p_user_name es el nombre del usuario y,
p_role_ids es la matriz de roles que reemplazará la existente.

Por ejemplo:

begin
    APEX_ACL.REPLACE_USER_ROLES (
        p_application_id => 255,
        p_user_name      => 'SCOTT',
        p_role_ids       => apex_t_number( 2505704029884282, 345029884282 ) );
end;
Procedimiento REPLACE_USER_ROLES (Sign. 2)

Similar al procedimiento anterior, reemplaza los roles existentes de un usuario por la nueva lista de roles proporcionada, utilizando la sintaxis:

APEX_ACL.REPLACE_USER_ROLES (
    p_application_id  IN NUMBER   default apex_application.g_flow_id,
    p_user_name       IN VARCHAR2,
    p_role_static_ids IN apex_t_varchar2 );

Donde, p_application_id es el identificador de la aplicación,
p_user_name es el nombre del usuario y,
p_role_static_ids es la lista de nombres de los nuevos roles a asignar al usuario.

Por ejemplo:

begin
    APEX_ACL.REPLACE_USER_ROLES (
        p_application_id  => 255,
        p_user_name       => 'SCOTT',
        p_role_static_ids => apex_t_varchar2( 'ADMINISTRATOR', 'CONTRIBUTOR' ) );
end;
Procedimiento REMOVE_ALL_USER_ROLES

Este procedimiento remueve todos los roles que un usuario tiene asignados y utiliza la sintaxis:

APEX_ACL.REMOVE_ALL_USER_ROLES (
    p_application_id IN NUMBER   default apex_application.g_flow_id,
    p_user_name      IN VARCHAR2 );

Donde, p_application_id es el identificador de la aplicación y,
p_user_name es el nombre del usuario.

Por ejemplo:

begin
    APEX_ACL.REMOVE_ALL_USER_ROLES (
        p_application_id  => 255,
        p_user_name       => 'SCOTT' );
end;
Share This