Anwenderabhängige Berechtigungen in Eclipse Rich Clients implementieren

Autorisierung in RCP-Anwendungen

Michael Buchholz

Die Eclipse Rich Client Platform bietet Konzepte zur Unterstützung von Daten- und Kontext-abhängigen Berechtigungen. Häufig muss sich der Anwender jedoch erst authentifizieren und darf in Abhängigkeit seiner Rolle nur bestimmte Funktionen innerhalb einer Anwendung nutzen. Dieser Artikel zeigt die Probleme auf, die bei der Implementierung von Anwender-abhängigen Berechtigungen aufgetreten sind und stellt die gefundenen Lösungen dar.

Die Rich Client Platform bietet eine breite Unterstützung bei der Realisierung von Daten- und Kontext-abhängigen Berechtigungen, wie die folgenden Beispiele verdeutlichen:

  • Über den Erweiterungspunkt (Extension Point) org.eclipse.ui.editorActions können Aktionen an einen bestimmten Editortyp gebunden werden. Die Aktion steht dem Anwender in diesem Fall nur zur Verfügung, wenn ein Editor des entsprechenden Typs aktiv ist.
  • Das Interface org.eclipse.ui.IActionDelegate stellt die Methode selectionChanged(IAction, ISelection) bereit, sodass die zugehörige Aktion in Abhängigkeit von der aktuellen Selektion aktiviert bzw. deaktiviert werden kann.

Anwender-abhängige Berechtigungen werden jedoch nicht direkt unterstützt, und eine Eigenimplementierung wird zum Teil durch die internen RCP-Mechanismen zusätzlich erschwert.

Aktionen

Aktionen sind die in der Praxis am häufigsten zu berechtigenden UI-Elemente einer Anwendung. In Eclipse existieren für Aktionen zwei Ausprägungen: Einträge in Menüs und Werkzeugleisten (Toolbar-Buttons). Aktionen können entweder direkt in Java programmiert oder über Einträge im Plug-in-Manifest deklariert werden. Im zweiten Fall wird eine Klasse benötigt, an welche die Ausführung der Aktion delegiert wird.

Aktionen im Quellcode

Werden Aktionen direkt im Quellcode in Menüs und Toolbars integriert, so lässt sich eine Anwender-abhängige Berechtigung relativ einfach implementieren. Die Berechtigungsprüfung kann in diesem Fall in einer Basisklasse implementiert werden (Listing 1), von der alle zu berechtigenden Aktionen abgeleitet werden. Diese Basisklasse implementiert das Interface org.eclipse.jface.action.IAction oder sie ist wie im Beispiel von org.eclipse.jface.action.Action abgeleitet. Die Berechtigungsprüfung findet in der Methode setEnabled(boolean) aus IAction statt (siehe Berechtigungssystem). Sofern für eine Aktion nicht explizit setEnabled(boolean) aufgerufen wird, ist diese standardmäßig aktiviert. Daher muss im Konstruktor unbedingt setEnabled(boolean) aufgerufen werden! Dadurch wird sichergestellt, dass auf jeden Fall eine Überprüfung stattfindet und die Aktion deaktiviert wird, falls dem Anwender die notwendige Berechtigung fehlt.

import org.eclipse.jface.action.Action;

public abstract class AbstractAuthorizedAction extends Action {
    protected AbstractAuthorizedAction() {
        super();
        // Ensure that user permission for this action is checked (by default
        // the action is enabled).
        setEnabled(true);
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.action.Action#setEnabled(boolean)
     */
    @Override
    public final void setEnabled(boolean enabled) {
        super.setEnabled(
            enabled && AccessControl.hasPermission(getClass().getName()));
    }
} 

Berechtigungssystem

Das verwendete System zur Authentifizierung des Anwenders und zur Verwaltung der Berechtigungen ist für diesen Artikel irrelevant. Daher ist die konkrete Implementierung durch eine Schnittstelle gekapselt.

Authentifizierung

Die Authentifizierung des Anwenders erfolgt innerhalb der Methode AccessControl.login().Diese liefert true zurück, falls sich der Anwender erfolgreich authentifiziert hat, andernfalls false.

Autorisierung

AccessControl.hasPermission(String) wird überprüft, ob der angemeldete Anwender für eine bestimmte Aktion berechtigt ist. Die Methode liefert true zurück, falls die Berechtigung vorhanden ist, andernfalls false. In den verwendeten Beispielen dient der Klassenname der Aktion bzw. die im Plug-in-Manifest vergebene ID eines Elements (Perspektive, Wizard, .) als Schlüssel zur Identifizierung der erforderlichen Berechtigung.

Aktionen im Plug-in-Manifest

Aktionen können auch als Implementierung eines Erweiterungspunktes (z.B. org.eclipse.ui.editorActions) in die Anwendung integriert werden. Alle erforderlichen Daten werden im Plug-in-Manifest festgelegt (Abb. 1). Dazu gehören u.a. Name, Tooltip, Icon, Menü- und Toolbar-Pfad sowie die Implementierungsklasse.

Abb. 1: Plug-in-Manifest: org.eclipse.ui.editorActions
Geschrieben von
Michael Buchholz
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.