O'Reilly logo

Die OSGi Service Platform: Eine Einführung mit Eclipse Equinox by Matthias Lübken, Bernd Kolb, Nils Hartmann, Gerd Wütherich

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

293
17 Der User Admin Service
Motivation
In den Beispielen und Tutorials der zurückliegenden Kapitel sind die in
den verschiedenen Bundles implementierten Aktionen für alle Anwen-
der nutzbar. In vielen Anwendungssystemen ist es jedoch notwendig,
bestimmte Aktionen nur ausgewählten Anwender zur Verfügung zu
stellen. So ist es i.d.R. nicht sinnvoll, normalen Anwendern die Installa-
tion und Deinstallation von Bundles zu erlauben, während diese Aktio-
nen für einen Administrator zwingend zur Verfügung stehen müssen.
In diesem Kapitel stellen wir Ihnen den User Admin Service vor.
Der User Admin Service stellt Ihnen eine einfache Benutzerverwaltung
zur Verfügung, mit der Sie Benutzer und Benutzergruppen einrichten,
verwalten und entfernen nnen. Vor der Ausführung einer Aktion
können Sie dann bspw. über die Zugehörigkeit zu einer bestimmten
Benutzergruppe überprüfen, ob ein Benutzer für die Ausführung der
Aktion autorisiert ist.
Einordnung
Der User Admin Service ist in Kapitel 107 des OSGi Service Com-
pendium beschrieben. Er ist nicht Bestandteil der OSGi Mobile Speci-
fication.
17.1 Tutorial: Ein Login-Kommando
Überblick
Im Tutorial zu diesem Kapitel stellen wir Ihnen die Verwendung des
User Admin Service anhand zweier neu zu implementierenden Kom-
mandos für die Eclipse-Equinox-Konsole vor:
Das Kommando login: Das Kommando
login ermöglicht einem
Anwender, sich mit einem Benutzernamen und einem Passwort im
System anzumelden.
Das Kommando listroles: Das Kommando
listroles gibt alle im
System verfügbaren Rollen (Benutzer und Gruppen) auf der
Equinox-Konsole aus. Dieses Kommando soll jedoch nur dann
ausgeführt werden können, wenn der eingeloggte Benutzer die
»Administrator«-Rolle besitzt.
17 Der User Admin Service294
Zusätzlich implementieren wir eine Klasse UserRepositoryInitializer,
mit der beim Start der implementierenden Service Component zwei
Benutzer (»admin« und »andi«) und zwei Gruppen (»Administrator
und »Users«) im User Repository angelegt werden. Beide Kommandos
sowie die Klasse
UserRepositoryInitializer implementieren wir im
Bundle
org.osgibook.console.user (vgl. Abb. 17–1).
Die Plug-in-Projekte
In Abb. 17–2 sind die fertigen Projekte aus diesem Tutorial abgebildet.
Abb. 17–1
Übersicht über die
beteiligten Bundles
CommandProvider
verwendet
Klassen aus
verwendet
Service
OSGi Service Platform /
Declarative Services
Co a d o
der
MANIFEST.MF
META-INF
org.osgibook.console.user
UserAdmin
OSGi Service Platform /
User Admin Service
OSGI-INF
Abb. 17–2
Die Plug-in-Projekte
29517.1 Tutorial: Ein Login-Kommando
Schritt 1: Anlegen des Bundles
Legen Sie zunächst ein neues Bundle mit dem Namen org.osgibook.
console.user
und dem folgenden Import-Package-Header an:
Import-Package:
org.eclipse.osgi.framework.console;version="1.0.0",
org.osgi.framework;version="1.4.0",
org.osgi.service.component;version="1.0.0",
org.osgi.service.useradmin;version="1.1.0"
Schritt 2: Implementierung der Klasse UserRepositoryInitializer
Zunächst implementieren wir eine einfache Hilfsklasse, den
UserRepositoryInitializer, mit dessen Hilfe Testbenutzer (»admin« und
»andi«) und -gruppen (»Administrators« und »Users«) im User Repo-
sitory angelegt werden (vgl. Listing 17–1). Der
UserRepository
Initializer
wird später bei der Aktivierung der Service Component
aufgerufen, die die beiden Kommandos bereitstellt.
package org.osgibook.console.user;
import org.osgi.service.useradmin.Group;
import org.osgi.service.useradmin.Role;
import org.osgi.service.useradmin.User;
import org.osgi.service.useradmin.UserAdmin;
public class UserRepositoryInitializer {
private UserAdmin userAdmin;
public UserRepositoryInitializer(UserAdmin userAdmin) {
this.userAdmin = userAdmin;
}
public void initializeUserRepository() {
Group adminGroup = createGroup("Administrators");
Group userGroup = createGroup("Users");
createUser("andi", "secret", userGroup);
createUser("admin", "osgi", adminGroup);
}
private Group createGroup(String name) {
return (Group) this.userAdmin.createRole(name, Role.GROUP);
}
private void createUser(String name, String password,
Group group) {
Listing 17–1
Die Klasse
UserRepositoryInitializer
17 Der User Admin Service296
User user = (User) userAdmin.createRole(name, Role.USER);
if (user != null) {
user.getProperties().put("login.name", name);
user.getCredentials().put("login.password", password);
group.addMember(user);
}
}
}
Schritt 3: Implementieren der User-Komponente
Den Command Provider, der das login- und das listroles-Kommando
bereitstellt, implementieren wir in Form einer Service Component mit
der Komponentenklasse
UserComponent. Legen Sie die Klasse ebenfalls
im Package
org.osgibook.console.user an. Das nachfolgende Listing
17–2 zeigt neben der Implementierung des Interface
CommandProvider
auch, wie bei der Aktivierung der Component der User Repository Ini-
tializer aufgerufen wird:
package org.osgibook.console.user;
[...]
import org.osgi.service.useradmin.Authorization;
import org.osgi.service.useradmin.Group;
import org.osgi.service.useradmin.Role;
import org.osgi.service.useradmin.User;
import org.osgi.service.useradmin.UserAdmin;
public class UserComponent implements CommandProvider {
private UserAdmin userAdmin;
[...]
protected void setUserAdmin(UserAdmin userAdmin) {
this.userAdmin = userAdmin;
}
protected void unsetUserAdmin(UserAdmin userAdmin) {
this.userAdmin = null;
}
protected void activate(ComponentContext componentContext) {
new UserRepositoryInitializer(userAdmin).
initializeUserRepository();
}
public String getHelp() {
Listing 17–2
Die Komponentenklasse
UserComponent
29717.1 Tutorial: Ein Login-Kommando
StringBuilder help = new StringBuilder();
help.append("login <username> <password> - Anmelden\n").
append("listgroups - Alle Gruppen ausgeben");
return help.toString();
}
[...]
}
In der Komponentenbeschreibung spezifizieren Sie anschließend die
Komponentenklasse sowie die bereitgestellten und erforderlichen Ser-
vices (vgl. Listing 17–3):
<?xml version="1.0"?>
<component name="userComponent">
<implementation
class="org.osgibook.console.user.UserComponent"/>
<service>
<provide interface=
"org.eclipse.osgi.framework.console.CommandProvider"/>
</service>
<reference name="userAdmin"
interface="org.osgi.service.useradmin.UserAdmin"
bind="setUserAdmin"
unbind="unsetUserAdmin"
/>
</component>
Schritt 4: Das login-Kommando implementieren
Das login-Kommando, mit dem sich ein Benutzer anmelden kann,
erwartet zwei Parameter: den Namen sowie das Passwort des Benut-
zers. Wenn ein entsprechender Benutzer über den User Admin Service
gefunden wurde und das eingegebene Passwort korrekt ist, wird der
Benutzer eingeloggt. In diesem Fall wird das
User-Objekt, das den
Benutzer repräsentiert, gesetzt, um darauf später Autorisierungsabfra-
gen durchführen zu können.
Implementieren Sie also folgende
_login()-Methode in der Kom-
ponentenklasse:
package org.osgibook.console.user;
[...]
public class UserComponent implements CommandProvider {
private User currentUser;
[...]
Listing 17–3
Die Komponenten-
beschreibung
Listing 17–4
Implementierung des
Kommandos login

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required