APEX-Authentifizierung mal anders: Benutzer für einzelne Applikationen freischalten

Wenn die in Application Express eingebaute Benutzerverwaltung als Authentifizierungsschema verwendet wird, kann sich jeder Nutzer eines Workspace an allen Applikationen eben dieses Workspace anmelden. Befinden sich mehrere Applikationen in einem Workspace, so wünscht man sich gelegentlich, dass man bestimmte Nutzer gezielt für einzelne Applikationen freischalten kann. Auf den ersten Blick geht das nicht - die APEX-Benutzerverwaltung kennt keine Eigenschaft, in welche man freigeschaltete Applikationen eintragen könnte. Mit ein wenig Programmierung und einer Tabelle geht es aber doch ...

Modell für Zugriffsprivilegien: "m" Nutzer können "n" Anwendungen nutzen

Modell für Zugriffsprivilegien: "m" Nutzer können "n" Anwendungen nutzen

Erzeugen Sie sich zunächst im SQL Workshop eine Tabelle für die Speicherung der Zuordnungen zwischen Nutzer und Applikation. Sie können die Tabelle entweder mit dem Assistenten oder direkt per SQL einrichten. Das folgende SQL zeigt die "Minimalausstattung"; weitere Spalten für Bemerkungen, Zeitstempel oder andere Dinge sind natürlich problemlos zusätzlich möglich:

CREATE TABLE MY_USERS_APPLICATIONS(
  USERID varchar2(4000),
  APPID  number(20),
  constraint pk_my_users_apps primary key (userid, appid)
)
/

create or replace trigger tr_validate_apex_user_and_app
before insert or update on MY_USERS_APPLICATIONS
for each row 
declare 
  v_exists number;
begin
  -- Nutzername in Großschreibung umwandeln ...
  :new.userid := upper(:new.userid);

  -- Feststellen, ob dieser Nutzer im Workspace existiert ...
  begin
    select 1 into v_exists from apex_workspace_apex_users 
    where user_name = :new.userid;
  exception
    when NO_DATA_FOUND then 
      raise_application_error(-20000'user does not exist in workspace');
  end;

  -- Feststellen, ob diese Anwendung im Workspace existiert ...
  begin
    select 1 into v_exists from apex_applications
    where application_id = :new.appid;
  exception
    when NO_DATA_FOUND then 
      raise_application_error(-20000'application id does not exist in workspace');
  end;
end;
/

Der Trigger tr_validate_apex_user_and_app stellt sicher, dass nur existierende Nutzernamen und Applikations-IDs eingetragen werden können. Füllen Sie die Tabelle nun mit ein paar Datensätzen (legen Sie sich bei Bedarf zunächst einige Nutzerkonten an). Nutzen Sie zunächst den SQL Workshop zum Füllen der Tabelle - natürlich können Sie auch eine eigene Anwendung mit einem Formular zur "Administration" der Tabelle erzeugen.

Erstellen Sie als nächstes die PL/SQL-Funktion zur Prüfung der Anmeldung eines Nutzers. Diese Funktion muss (ebenso wie das eingebaute APEX-Authentifizierungsschema) Username und Passwort prüfen und zusätzlich anhand der soeben erstellten Tabelle feststellen, ob der Nutzer diese Applikation überhaupt nutzen darf.

create or replace function my_users_apps_authfunc (
  p_username in varchar2,
  p_password in varchar2
) return boolean
is
  v_pw_ok    boolean := false;
  v_app_ok   number  := 0;
begin
  begin
    select 1 into v_app_ok from MY_USERS_APPLICATIONS
    where appid =v('APP_ID') and userid = p_username;
  exception
    when others then null;
  end;
  if v_app_ok = 1 then
    v_pw_ok := apex_util.is_login_password_valid(p_username, p_password);
  end if;
  return v_pw_ok;
end;

Erzeugen Sie nun das Authentifizierungsschema, welches diese Tabelle nutzt. Navigieren Sie dazu zu den Gemeinsamen Komponenten und dort zu den Authentifizierungsschemas. Mit Klick auf die Schaltfläche Erstellen erzeugen Sie ein neues Authentifizierungsschema. Erstellen Sie es völlig neu.

Authentifizierungschema erstellen: Völlig neu!

Abbildung 1: Authentifizierungschema erstellen: Völlig neu!

Geben Sie Ihrem Authentifizierungsschema einen Namen und evtl. eine erklärende Beschreibung.

Name und Beschreibung für das Authentifizierungschema vergeben

Abbildung 2: Name und Beschreibung für das Authentifizierungschema vergeben

Übernehmen Sie nun bis zur Seite Ungültiges Session-Ziel die Voreinstellungen. Als Ungültiges Session-Ziel wählen Sie eine Seite in dieser Anwendung und aus der dann erscheinenden Auswahlliste die Seite 101 aus.

Login-Seite "101" eintragen

Abbildung 3: Login-Seite 101 eintragen

Übernehmen Sie nun wiederum bis zur Authentifizierungsfunktion die Voreinstellungen. Dort wählen Sie Meine benutzerdefinierte Funktion für die Authentifizierung verwenden aus und tragen Sie die eben erstellte Funktion ein, aber achten Sie dabei darauf, ein return voranzustellen:

Authentifizerungsfunktion hinterlegen

Abbildung 4: Authentifizerungsfunktion hinterlegen

Übernehmen Sie nun wieder bis zur Abmelde-URL die Voreinstellungen; dort tragen Sie dann folgende URL ein.

wwv_flow_custom_auth_std.logout?p_this_flow=&APP_ID.&p_next_flow_page_sess=&APP_ID.:1
Abmelde-URL eintragen

Abbildung 5: Abmelde-URL eintragen

Bestätigen Sie zum Schluß Ihre Angaben und erstellen Sie das Authentifizierungsschema. Nun müssen Sie es nun für die Anwendung "aktuell" machen. Klicken Sie dazu auf den Reiter Aktuelles Element ändern (Abbildung 6) und wählen Sie das neue Authentifizierungsschema aus (Abbildung 7).

Authentifizierungsschema wurde erstellt

Abbildung 6: Authentifizierungsschema wurde erstellt

Neues Authentifizierungsschema als "aktuelles" auswählen

Abbildung 7: Neues Authentifizierungsschema als "aktuelles" auswählen

Starten Sie nun die Anwendung. Sie sehen daraufhin die gewohnte Login-Seite. Sie können sich jedoch nur dann mit einem APEX-Benutzerkonto anmelden, wenn dieser Nutzername zusammen mit der Applikations-ID in die Tabelle MY_USERS_APPLICATIONS eingetragen ist. Ist das nicht der Fall, erscheint nur die Fehlermeldung Invalid Login Credentials.

Wenn Sie dieses Authentifierungsschema nun in einer anderen Anwendung (aber im gleichen) Workspace nutzen möchten, navigieren Sie zunächst zu den Gemeinsamen Komponenten der anderen Anwendung, dort zu den Authentifizierungsschemas und klicken wiederum auf Erstellen. Sie erstellen das Schema nun aber nicht völlig neu, sondern Als Kopie eines vorhandenen Authentifizierungsschemas.

Authentifizierungsschema kopieren: Schritt 1

Abbildung 8: Authentifizierungsschema kopieren: Schritt 1

Wählen Sie im nächsten Dialog die Anwendung aus, in der Sie das Schema vorhin erstellt haben.

Anwendung, aus der kopiert werden soll, auswählen

Abbildung 9: Anwendung, aus der kopiert werden soll, auswählen

Wählen Sie nun noch die Authentifizierungsschemas aus, die kopiert werden sollen; Sie können gleichzeitig auch ggfs. abweichende Namen vergeben.

Zu kopierende Authentifizierungsschemas auswählen

Abbildung 10: Zu kopierende Authentifizierungsschemas auswählen

Legen Sie schließlich (wie vorhin) das kopierte Authentifizierungsschema als aktuelles Schema fest - damit reagiert diese Anwendung genauso wie die erste.

Und wenn Sie das Authentifizierungsschema auch noch in einem anderen Workspace nutzen möchten, können Sie den Komponenten-Export nutzen. Dieser befindet sich in den Gemeinsamen Komponenten rechts (Abbildung 11). Damit ist es möglich, nur das Authentifizierungsschema zu exportieren und damit auch nur dieses in einen anderen Workspace zu importieren - achten Sie jedoch darauf, dass Sie auch die Tabelle MY_USERS_APPLICATIONS im neuen Datenbankschema erzeugen und mit Inhalten füllen müssen.

Komponenten Export

Abbildung 11: Komponenten Export

Das Beispiel kann natürlich noch fortgesetzt werden. Wie zu Beginn schon gesagt, wäre eine Administrationsanwendung mit Bericht und Formular auf die Tabelle MY_USERS_APPLICATIONS der nächste Schritt - dies soll hier jedoch nicht weiter vertieft werden, da für eine solche Anwendung das gleiche gilt, wie für jede andere Anwendung auf beliebige Tabellen auch - bei der Erstellung sind Ihrer Phantasie also keine Grenzen gesetzt.

Zurück zur Community-Seite