Application Express – Mehrsprachigkeit & Mandantenfähigkeit © Copyright 2014. Apps Associates LLC. 1 Agenda • Einleitung • Mehrsprachigkeit – Übersetzung mit Hilfe von XLIFF-files – Übersetzung mit Hilfe einer Übersetzungstabelle • Mandantenfähigkeit – Virtual Private Database – Do It Yourself • Fazit © Copyright 2014. Apps Associates GmbH. 2 Einleitung • Wachsende Anforderungen an Web-Applikationen • Mehrsprachigkeit • Mandantenfähigkeit • Viele Wege führen nach Rom • Verschiedene Beispiele aufzeigen • Vor- und Nachteile © Copyright 2014. Apps Associates LLC. 3 Mehrsprachigkeit Beispiel: Eine Applikation, die ein Formular enthält, die auf der Tabelle EMP basieren, soll auf Englisch und Deutsch zur Verfügung stehen. • Applikation, wie gewöhnt erstellen „Application Primary Language“ hier English (en) • Applikationssprache vom Wert eines Items abhängig machen © Copyright 2014. Apps Associates LLC. 4 Mehrsprachigkeit • Erstellen eines speziellen Application Item zum Ändern der Sprache Wichtig: - Name des Items: FSP_LANGUAGE_PREFERENCE - Session State Protection: Unrestricted • Problem: Änderungen des Werts des Items FSP_LANGUAGE_PREFERENCE sind erst sichtbar, wenn die Seite neu geladen wurde Application Process - Point: On Load: Before Header (page template header) - Process Text begin owa_util.redirect_url('f?p='||:APP_ID||':'||:APP_PAGE_ID||':'| |:APP_SESSION); end; - Condition Type: Request = Expression 1 Expression 1 = LANG © Copyright 2014. Apps Associates LLC. 5 Mehrsprachigkeit • Sprachwechsel für den User in der Navigation Bar ermöglichen ist für jeden User auf jeder Seite ständig sichtbar • Unter „Shared Components“ „Navigation Bar Entries“ neuen Eintrag mit folgenden Einstellungen erstellen: - Option: From Scratch - Type: Navigation to URL - Label: English - Target is a: Page in this application - Page: &APP_PAGE_ID. - Request: LANG - Set these Items: FSP_LANGUAGE_PREFERENCE - With these values: en • Weiteren Eintrag für Deutsch © Copyright 2014. Apps Associates LLC. 6 Mehrsprachigkeit Zwei Wege die Applikation zu übersetzen • mit Hilfe einer XLIFF Datei • mit Hilfe einer Übersetzungstabelle © Copyright 2014. Apps Associates LLC. 7 Mehrsprachigkeit mit Hilfe einer XLIFF Datei • XLIFF steht für XML Localization Interchange File Format • zur Darstellung hierarchisch strukturierter Inhalts-Daten • speziell für den verlustarmen Austausch von Übersetzungsdaten und den dazugehörigen Kontextinformationen © Copyright 2014. Apps Associates LLC. 8 Mehrsprachigkeit mit Hilfe einer XLIFF Datei • unter „Shared Components“ „Globalization“ „Translat Application“ „Map your primary language application to a translated application“ kann eine neue Applikation in einer anderen Sprache erstellt werden. - dazu eine freie Application ID und die gewünschte Sprache angeben • für jeden zu übersetzenden Text der Applikation müssen Einträge im APEX Repository erstellet werden - unter „Seed translatable test to translation repository“ • unter „Download XLIFF translation files from translation repository“ wird die XLIFF Datei runtergeladen - der gesamten Applikation - einzelner Seiten © Copyright 2014. Apps Associates LLC. 9 Mehrsprachigkeit mit Hilfe einer XLIFF Datei • diese XLIFF Datei übersetzen - Übersetzung zwischen <target> • unter „Upload and apply XLIFF translation files to translation repository“ wird die geänderte XLIFF Datei hochgeladen • unter „Publish translated applications“ wird die Übersetzung veröffentlicht © Copyright 2014. Apps Associates LLC. 10 Mehrsprachigkeit mit Hilfe einer XLIFF Datei • diese XLIFF Datei © Copyright 2014. Apps Associates LLC. 11 Mehrsprachigkeit mit Hilfe einer Übersetzungstabelle • erstellen einer Übersetzungstabelle (T_UEBERSETZUNG) - ID_Uebersetzung - Bezeichnung - EN (Englisch) - DE (Deutsch) • Daten, für jeden zu übersetzenden Text der Applikation, in die Tabelle schreiben © Copyright 2014. Apps Associates LLC. 12 Mehrsprachigkeit mit Hilfe einer Übersetzungstabelle • auf jeder Seite der Applkation eine neue Region erstellen • für jeden zu übersetzenden Text der Applikation ein Hidden Item in der neuen Region erstellen • erstellen eines Prozesses mit folgenden Einstellungen: - Process Point: On Load - Before Header - Condition Type: none • der Prozess schreibt abhängig vom Wert des Items FSP_LANGUAGE_PREFERENCE die deutschen oder die englischen Texte in die Hidden Items • alle Namen der Items, Buttons, Regionen usw. sind vom Wert der jeweiligen Hidden Items abhängig zum Beispiel: das Item P2_SAL hat die Label-Einstellung: „&P2_HIDDEN_SAL.“ weil das Item P2_HIDDEN_SAL je nach ausgewählter Sprache den Wert „Sal“ oder „Gehalt“ hat © Copyright 2014. Apps Associates LLC. 13 Mehrsprachigkeit mit Hilfe einer Übersetzungstabelle • diese XLIFF Datei © Copyright 2014. Apps Associates LLC. 14 Mehrsprachigkeit Mehrsprachigkeit mit Hilfe einer XLIFF Datei • APEX Standard Mittel • geringer Aufwand • Anpassungen im JavaScript aufwendiger • vorteilhaft wenn eine Applikation in einer Sprache übersetzt werden soll Mehrsprachigkeit mit Hilfe einer Übersetzungstabelle • relativ hoher Aufwand • vorteilhaft bei Anwendungen, die in mehrere Sprachen übersetzt werden sollen oder bei denen sich Übersetzungen oft ändern User können die Übersetzungstabelle selber pflegen © Copyright 2014. Apps Associates LLC. 15 Mandantenfähigkeit • Virtual Private Database • Do It Yourself © Copyright 2014. Apps Associates LLC. 16 Virtual Private Database Virtual Private Database (VPD) = Fine Grained Access Control (FGAC) • seit der Version Oracle8i • Feature der Enterprise Edition • unabhängig wie auf geschützte Tabellen zugegriffen wird (Anwendung, WebInterface oder SQL * Plus) • kontrolliert den Zugriff auf einzelne Zeilen oder Spalten auf Ebene der Tabelle © Copyright 2014. Apps Associates LLC. 17 Virtual Private Database Beispiel: Ein Kunde kann nur seine Bestellungen in der Tabelle Bestellungen sehen, wenn er in der Tabelle Kunden eingetragen wurde. Tabelle Kunden customer_id cust_first_name cust_last_name 1 John Dulles 2 William Hartsfield order_date order_total customer_id 23.02.2014 1890 1 09.03.2014 2385 2 05.07.2014 2317 1 Tabelle Bestellungen © Copyright 2014. Apps Associates LLC. 18 Virtual Private Database Mit „Column Relevance“ kann definiert werden, dass VPD nur angewendet wird, wenn eine kritische Spalte abgerufen wird. Beispiel: Der Kundenbetreuer mit dem account_mgr_id "149" kann alle Zeilen aus der Tabelle Kunden sehen, aber nicht die Kreditlimits. Sobald die Spalte „credit_limit“ abgefragt wird, kann er nur seine eigenen Kunden sehen. cust_first_name cust_last_name account_mgr_id John Dulles 149 William Hartsfield 125 Edward Logan 149 Albert Lambert 134 cust_first_name cust_last_name credit_limit account_mgr_id John Dulles 1200 149 Edward Logan 2500 149 © Copyright 2014. Apps Associates LLC. 19 Virtual Private Database Mit „Column Hiding“ können öffentliche Informationen der Tabelle angezeigt werden. Vertrauliche Informationen werden verborgen. Beispiel: Der Kundenbetreuer mit dem account_mgr_id "149" kann alle Zeilen aus der Tabelle Kunden sehen, aber die Spalte credit_limit ist leer. Außer bei seinen eigenen Kunden. cust_first_name cust_last_name credit_limit account_mgr_id John Dulles 1200 149 Edward Logan 2500 149 William Hartsfield 125 Albert Lambert 134 © Copyright 2014. Apps Associates LLC. 20 Virtual Private Database Einrichtung von VPD in APEX-Anwendungen Beispiel: Die Tabelle EMP soll geschützt werden. Zur Umsetzung einer mandantenfähigen Anwendung werden zunächst die Zugriffsregeln definiert. • KING darf alle Informationen sehen • JONES darf alle Informationen zur Abteilung 10 (ACCOUNTING) sehen • SCOTT darf nur seinen eigenen Datensatz sehen Diese Privilegien werden in einer neuen Tabelle MY_USERS hinterlegt. create table my_users( userid varchar2(50), class varchar2(50), depts varchar2(50) ); insert into my_users values (‚JONES','DEPTADM','10'); insert into my_users values ('KING','ADMIN',''); © Copyright 2014. Apps Associates LLC. 21 Virtual Private Database Einrichtung eines Session Context, welcher beim Aufbau der Datenbanksitzung initialisiert werden muss. Im Session Context wird der Name des eingeloggten Nutzers, die Privilegien und die Abteilungen, für die die Privilegien gelten für die Dauer der Datenbanksitzung gespeichert. Mit folgendem Code wird der Session Context my_context erzeugt. Dieser darf nur durch das PL/SQL-Paket my_login_package geändert werden. create or replace context my_context using my_login_package; Hinweis • Restriktive Ausführungsrechte an diesem Package keine Manipulation möglich, kein Aushebeln der VPD-Policies • Privileg CREATE ANY CONTEXT © Copyright 2014. Apps Associates LLC. 22 Virtual Private Database Ecreate or replace package my_login_package is procedure set_context(p_userid in varchar2); end my_login_package; / create or replace package body my_login_package is procedure set_context(p_userid in varchar2) is v_class my_users.CLASS%TYPE := 'USER'; v_deptno my_users.DEPTS%TYPE := ''; begin for cl in (select class,depts from my_users where userid = p_userid) loop v_class := cl.class; v_deptno := cl.depts; end loop; dbms_session.set_context('my_context','class', v_class); dbms_session.set_context('my_context','deptno', v_deptno); dbms_session.set_context('my_context','userid', p_userid); end set_context; end my_login_package; / © Copyright 2014. Apps Associates LLC. 23 Virtual Private Database • anlegen der eigentliche Policy-Funktion • liest den Session Context mit der SQL-Funktion SYS_CONTEXT aus • erstellt eine SQL WHERE-Bedingung, die später von der Datenbank automatisch an jede SQL-Abfrage auf die Tabelle EMP angehängt wird. create or replace function my_policy( p_schema varchar2, p_object varchar2 ) return varchar2 is v_sql varchar2(32767); begin if sys_context('my_context','class') = 'ADMIN' then null; elsif sys_context('my_context','class') = 'DEPTADM' then v_sql := ' DEPTNO in ( '||sys_context('my_context','deptno')||')'; else v_sql := ' ENAME = '''||sys_context('my_context','userid')||''''; end if; return v_sql; end; © Copyright 2014. Apps Associates LLC. 24 Virtual Private Database • vor jedem SQL-Kommando wird die Policy-Funktion aufgerufen und die zusätzliche WHERE-Klausel zurückgegeben • die SQL-Abfrage wird mit den zusätzlichen Einschränkungen ausgeführt • dafür muss die Policy-Funktion zum Abschluss mit dem PL/SQL-Paket DBMS_RLS registriert werden begin DBMS_RLS.ADD_POLICY( object_schema => '[myschema]', object_name => 'EMP', policy_name => 'MY_EMP_POLICY', function_schema => '[myschema]', policy_function => 'MY_POLICY'); end; © Copyright 2014. Apps Associates LLC. 25 Virtual Private Database VPD-Policy mit einer APEX-Anwendung nutzen • völlig unabhängig vom verwendeten Authentifizierungsschema • Wichtig: die Tabelle my_users muss die richtigen Usernamen enthalten Im Beispiel werden Nutzerkonten im APEX-Workspace verwendet. Das heißt es wurden im Administrationsbereich unter „Manage Users and Groups“ Nutzerkonten für die User KING, JONES und SCOTT erstellt. © Copyright 2014. Apps Associates LLC. 26 Virtual Private Database • erstellen einer neuen Applikation mit einem Bericht auf die Tabelle EMP • es werden keine Daten angezeigt, auch wenn man sich als KING (Admin) einloggt der Session Context wird beim Anmelden an der Anwendung noch nicht initialisiert Dazu unter „Shared Components“ auf der rechten Seite auf „Edit Definition“ klicken und in der Reiterkarte „Security“ unter „Daterbase Session“ folgenden Code eingeben. begin my_login_package.set_context (:APP_USER); end; © Copyright 2014. Apps Associates LLC. 27 Virtual Private Database Ansicht: KING (Admin) © Copyright 2014. Apps Associates LLC. 28 Virtual Private Database Ansicht: JONES (Deptadm) Ansicht: SCOTT © Copyright 2014. Apps Associates LLC. 29 Virtual Private Database Vorteile • keine redundante Programmierarbeit • auch bei komplexen Berechtigungssystem sehr übersichtlich • Zugriffsrechte sind völlig unabhängig von APEX gilt für jede andere Anwendung Nachteil • nur für die Enterprise Edition © Copyright 2014. Apps Associates LLC. 30 Do It Yourself Mandantenfähigkeit Do It Yourself • für Standard Edition oder OracleXE Beispiel: Die Tabelle EMP soll geschützt werden. Zur Umsetzung einer mandantenfähigen Anwendung werden zunächst die Zugriffsregeln definiert. • KING darf alle Informationen sehen • JONES darf alle Informationen zur Abteilung 10 (ACCOUNTING) sehen • SCOTT darf nur seinen eigenen Datensatz sehen Diese Privilegien werden in einer neuen Tabelle MY_USERS hinterlegt. © Copyright 2014. Apps Associates LLC. 31 Mandantenfähigkeit Do It Yourself • WHERE-Bedingung im Bericht selber bauen select empno, ename, job, mgr, hiredate, sal, comm, deptno from emp where case when (select class from my_users where userid = :APP_USER) = ‘ADMIN‘ then 1 when (select class from my_users where userid = :APP_USER) = ‘DEPTADM‘ and deptno = (select depts from my_users where userid = ‘DEPTADM‘) then 1 when :APP_USER not in (select userid from my useres) and ename = :APP_USER then 1 end = 1 © Copyright 2014. Apps Associates LLC. 32 Virtual Private Database Vorteile • unabhängig von der DB-Version Nachteil • redundante Programmierarbeit • wird schnell unübersichtlich • Rechtesystem beschränkt sich nur auf die konkrete Anwendung © Copyright 2014. Apps Associates LLC. 33 Fazit • APEX bietet einige Unterstützung im Bereich Mehrsprachigkeit und Mandantenfähigkeit • Viele Weg führen zum Ziel, man muss den richtigen für seine Anforderungen finden © Copyright 2014. Apps Associates LLC. 34 Vielen Dank!