Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:apex_authorization_scheme_protect_link

Aufgabe:

In einem Bericht soll ein Link zum Bearbeiten nur dann aktiv sein, wenn der Anwender die entsprechenden Rechte in APEX besitzt und der Datensatz für Ihn auch freigeschaltet ist.

Für die Prüfung der Berechtigung steht bereits ein Authorization Scheme zur Verfügung.

Wir möchten allerdings jetzt das Authorization Scheme auf Einzelsatz Ebene der Daten einsetzen.

Lösung:

Über die PL/SQL API von APEX kann direkt auf das Schem zugegriffen werden:

-- Vor 19.1
APEX_UTIL.PUBLIC_CHECK_AUTHORIZATION (
    p_security_scheme    IN    VARCHAR2) 
RETURN BOOLEAN;
 
-- Nach 19.1
APEX_AUTHORIZATION.IS_AUTHORIZED (
    p_authorization_name IN VARCHAR2 )
    RETURN BOOLEAN;
 

https://docs.oracle.com/en/database/oracle/application-express/19.1/aeapi/PUBLIC_CHECK_AUTHORIZATION-Function-DEPRECATED.html

Beispiel Code :

CREATE OR REPLACE FUNCTION checkRowAccess( p_row_val VARCHAR2 
                                           ,p_sec_check VARCHAR2 
                                           ,p_security_scheme VARCHAR2 
                                           ,p_link_to VARCHAR
                                           ,p_link_item VARCHAR2
                                           ,p_session VARCHAR2
                                           ,p_app_id VARCHAR2) 
RETURN VARCHAR2
IS
    v_return      VARCHAR2(8000);
    v_admin_user BOOLEAN:=FALSE;
    v_row_link   VARCHAR2(8000);
 
BEGIN
    -- create the link with the correct checksum
    v_row_link := '<a href="' 
                || APEX_UTIL.PREPARE_URL( p_url => 'f?p=' 
                || p_app_id 
                || ':'
                || p_link_to
                ||':'
                || p_session
                ||'::NO::'
                || p_link_item
                ||':'
                || p_row_val
                , p_checksum_type => 'SESSION') 
                || '"><img src="/i/menu/pencil2_16x16.gif"></a>';
 
   -- check if the data is protected ( if 1 only Admin can change the data!)
 
    IF p_sec_check = '1'  THEN
        v_admin_user :=  apex_util.public_check_authorization(p_security_scheme =>  p_security_scheme );
    END IF;
 
   IF  p_sec_check = '1' 
     AND  v_admin_user=FALSE THEN
       v_return:='<span aria-hidden="true" class="fa fa-universal-access fam-minus fam-is-disabled"></span>';
   ELSE
        v_return:=v_row_link;
   END IF;
 
RETURN v_return;
 
END checkRowAccess;

Aufruf im SQL eines Interactive Reports z.B. über:

SELECT
 -- generate the link text, switch off security for this row!
    checkRowAccess( dn.id             -- p_row_val 
               ,   dn.ADMIN_LOCK      -- ,p_sec_check 
               ,  'APEX_Admin'        -- ,p_security_scheme 
               ,  '332'               -- ,p_link_to 
               ,  'P332_ID'           -- ,p_link_item 
               ,  '&SESSION.'         -- ,p_session 
               ,  '&APP_ID.'          -- ,p_app_id 
               )
    AS LINK_TEXT 
....
-- show that the case can only accessed by privileged user
,CASE WHEN dn.ADMIN_LOCK = 1 THEN 'fa-lock fam-minus fam-is-danger' ELSE 'fa-unlock fam-blank fam-is-success' END AS ADMIN_LOCK
FROM my_table
WHERE
....

Quellen

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
prog/apex_authorization_scheme_protect_link.txt · Zuletzt geändert: 2019/11/04 14:34 von Gunther Pippèrr