Hola amigos, el otro día un amigo me comentó que tenía problemas al trabajar con el JasperReports Integration kit cuando cambiaba de Workspace.
Básicamente cuando trabajaba con una aplicación en el workspace1 funcionaba bien la pre visualización de los reportes en PDF, pero cuando desde la misma PC cambiaba al workspace2 usando otra aplicación que también tiene instalado el Kit, ya no le funcionaba la pre visualización de los PDF.
El problema radica en el Access Control List(ACL), desde Oracle 11g los paquetes como UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP, y UTL_INADDR los cuales pueden ser usados para acceder a los recursos de red externos, están más restringidos y asegurados. Oracle 11g introdujo Fine-Grained Access a estos paquetes mediante la creación de una lista de control de acceso (Access Control List ACL) para utilizar cualquier recurso de la red externa a través de estos paquetes.
Antes de esto cualquier usuario que tenía un privilegio de ejecución sobre estos paquetes era capaz de hacer cualquier cosa a cualquier recurso de red como servidores de correo web y locales, etc. Pero ahora un usuario necesita un poco más que sólo un privilegio EXECUTE sobre los paquetes de red. El kit utiliza el paquete UTL_HTTP y es por ello que necesitamos el ACL para dar permiso al esquema.
Por otro lado, tenemos que tener en cuenta que nosotros podemos asignar múltiples hosts a un ACL, por ejemplo: computadora, dominio o IP especificando el rango de los puertos, pero lo que no podemos hacer es asignar un host a múltiples ACL, si hacemos eso el usuario anterior (esquema) es eliminado para que tome efecto el usuario actual a la conexión, y es eso precisamente lo que pasa cuando se cambia de esquema al usar en este caso el kit, y por ello debemos crear una página que administre eso en la aplicación.
En el caso del uso de JasperReports Integration Kit en nuestras aplicaciones, debemos conceder el acceso y privilegio al esquema donde corre nuestra aplicación.
El Paquete PL/SQL que la aplicación de ejemplo del kit genera automáticamente es el siguiente:
declare
l_acl_name varchar2(100) := 'JasperReportsIntegration-CLARTECH.xml';
begin
begin
dbms_network_acl_admin.drop_acl(
acl => l_acl_name
);
exception
when others then null; -- ACL does not exist yet
end;
-- Privilege to connect to a host
dbms_network_acl_admin.create_acl(
acl => l_acl_name,
description => 'Accessing the local host for printing with Tomcat',
principal => upper('CLARTECH'), -- DB Schema (grantee)
is_grant => true,
privilege => 'connect',
start_date => null,
end_date => null
);
-- Privilege to resolve a hostname (DNS lookup)
dbms_network_acl_admin.add_privilege (
acl => l_acl_name,
principal => upper('CLARTECH'), -- DB Schema (grantee)
is_grant => true,
privilege => 'resolve',
start_date => null,
end_date => null
);
-- Privilege to connect to localhost
dbms_network_acl_admin.assign_acl(
acl => l_acl_name,
host => '127.0.0.1',
lower_port => 80,
upper_port => 10000
);
-- Privilege to connect to localhost
dbms_network_acl_admin.assign_acl(
acl => l_acl_name,
host => 'localhost',
lower_port => 80,
upper_port => 10000
);
-- Privilege to connect to localhost
dbms_network_acl_admin.assign_acl(
acl => l_acl_name,
host => 'localhost',
lower_port => 80,
upper_port => 10000
);
end;
/
commit
/
Donde podemos ver que el nombre del ACL es: 'JasperReportsIntegration-CLARTECH.xml' que agrega el nombre del esquema al final del nombre del archivo xml.
Se crea el ACL con el procedimiento: dbms_network_acl_admin.create_acl
Se asigna el privilegio al esquema con el procedimiento: dbms_network_acl_admin.add_privilege
Y se asigna el ACL a los distintos Hosts con el procedimiento: dbms_network_acl_admin.assign_acl
Este paquete lo debemos correr como sys dba para cada esquema que queramos usar el kit.
Por ello es importante tener en la aplicación un apartado de Administración y crear una página de Access Control para manejar estos aspectos propios de la aplicación.
Hasta Pronto!