Enterprise OSGi: The Big Picture

Security

Kunden und Konten unseres Beispielprojekts sind sensible Daten. Daher wollen wir den Zugriff darauf nur autorisierten Benutzern gewähren. Nur: Wie machen wir das? Für unser Beispielprojekt beschränken wir uns darauf, den Zugriff auf bestimmte URLs zu reglementieren. Die Verwaltung von Kunden und Konten über das User Interface ist Usern mit der Rolle Admin vorbehalten. Spring Security wäre eine Möglichkeit, das zu realisieren. Wie wir schon festgestellt haben, basiert Eclipse Gemini auf Spring. Spring Security passt gut zu Spring und somit auch zu unserem Beispielprojekt. Also probieren wir es einmal damit.

Spring Security arbeitet mit einem Servlet Filter. Ein Request wird nur dann an den gewünschten URL weitergeleitet, wenn der User angemeldet ist (also authentifiziert) und über ausreichende Berechtigungen verfügt (also autorisiert ist). Sowohl für die Authentifizierung als auch die Autorisierung eines Users gibt es eine Vielzahl von Möglichkeiten [18]. Die schauen wir uns nun am Beispielprojekt an.

Das Bundle com.pe-international.sample.security sorgt im Beispielprojekt für Authentifizierung und Autorisierung. Wir wählen eine HTTP-Basic-Authentifizierung und hinterlegen Username, Passwort und Rollen des Users in der Konfiguration von Spring Security. Die Spring-Security-Konfiguration zeigt Listing 4.

Listing 4

Diese Konfiguration liegt im Verzeichnis META-INF/spring/spring-security.xml. Dort findet Gemini Blueprint sie automatisch und sorgt dafür, dass die für Spring Security notwendigen Beans erzeugt werden. Etwas kniffelig ist nun nur noch das Einbinden als Filter. In einer JEE-Anwendung erfolgt dies über die web.xml. In unserem Fall müssen wir jedoch den Filter beim OSGi HttpService registrieren. Der HttpService aus dem OSGi-Standard unterstützt leider keine Filter. Aus der Patsche hilft uns der ExtendedHttpService von Eclipse Equinox, der auch Filter unterstützt. Jetzt müssen wir nur noch den von Eclipse Gemini Blueprint erzeugten Spring Security Filter beim ExtendendHttpService registrieren, wie in Listing 5 zu sehen.

Listing 5
private ExtendedHttpService httpService;
private org.springframework.security.web.FilterChainProxy filterChainProxy;

public void init() {
   Assert.notNull(httpService, "No HttpService present to register filter.");
   Assert.notNull(filterChainProxy, "No security filter present to register.");
   
   try {
      httpService.registerFilter("/", filterChainProxy, null, null);
   } catch (ServletException e) {
      throw new RuntimeException(ERROR_MESSAGE_FILTER_INIT, e);
   } catch (NamespaceException e) {
      throw new RuntimeException(ERROR_MESSAGE_FILTER_INIT, e); 
   }
}

Der ExtendedHttpService von Equinox und der FilterChainProxy von Spring Security werden per Dependency Injection über Gemini Blueprint injiziert. Ist das Security Bundle aktiv, laufen alle Requests über Spring Security. Spring Security prüft Username, Passwort und Rolle des Users. Damit haben wir die Security-Anforderungen an unser Beispielprojekt erfüllt. Wir haben gesehen, dass Spring Security sehr gut zu unserer Enterprise-Anwendung passt. Dabei haben wir nur an der Oberfläche von Spring Security gekratzt. Auch wesentlich komplexere Anforderungen lassen sich mit Spring Security erfüllen. Aber dazu ein andermal.

Kommentare

Schreibe einen Kommentar

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