SecurityContext für Acegi mit Request-Scope

Acegi Security-Framework für Spring

Wenn man mit Spring statt mit EJB arbeitet, ist ein Aspekt, welcher normalerweise komplett vom ApplikationServer abgedeckt wird, die Sicherheit. Hierzu gibt es die Standard-Lösung, die auch in vielen Artikeln und Büchern erwähnt und besprochen ist: Acegi

Zusammen mit Spring, lassen sich per AOP Interceptoren beim Zugriff auf Businessmethoden von SpringBeans dazwischen “weben”, die die Authentisierung des Aufrufers überwachen. Acegi benutzt hierzu einen SecurityContext, der auf unterschiedlichste Weise entstehen und befüllt werden kann.

In meinem konkreten Anwendungsfall wurde die Authentisierung einer WebApplikation mittels HTTP-Basic-Authentication realisiert und in der ersten zunächst scheinbar korrekten Konfiguration zeigten sich seltsame Effekte:

Neben den Zugriffen, die richtig authentisiert waren und demnach ohne weiteres ausgeführt wurden, konnte es passieren, dass manchmal auch ein nicht authentisierter Aufruf durchkam?

Wie sich heraus stellte, lebt der SecurityContext in einem ThreadLocal was im ApplikationenServer (hier Tomcat) mit dem jeweiligen WorkerThread assoziiert ist. Nun konnte es passieren, dass die SecurityContext eines vergangenen Requests “überlebt” hat und bei einem erneuten Zugriff wiederbenutzt wurde. So waren Zugriffe die zufällig mit dem “richtigen” WorkerThread ausgeführt wurden, falsch authentisiert.

Was hier fehlt (und in Acegi ist das nicht vorhanden) ist ein LifeCycle des SecurityContexts der sich am Request orientiert. Was Acegi bietet ist die Kontrolle des LifeCycles über eine Instance von “SecurityContextHolderStrategy” und eine solche “Strategy” für HTTP-Requests will ich hier einmal vorstellen.

Weiterlesen

Veröffentlicht unter Java | Hinterlasse einen Kommentar

Ableiten von Final-Klassen mit Gluonj

Ärgernis beim Testen

Beim Testen mit Unittests verwendet man meist Mock-Objecte, die die “Umgebung” der Klasse, die zu Testen ist “simulieren”. Dumm nur, dass diese Umgebung manchmal aus Klassen besteht, die kein Interface implementieren. Wenn dann auch noch einer dieser Klassen “final” ist (oder eine Methode), dann ist man selbst mit so schönen Mock “Generatoren” wie EasyMock am Ende.

EasyMock Classextensions

Zwar kann EasyMock mit den ClassExtensions auch Mock-Objecte von Klassen erzeugen, aber dazu dürfen diese nicht “final” sein. Das hat damit zu tun, dass unter der Haube mit Hilfe der CGLIB eine Ableitung der betreffenden Klasse erzeugt wird, die als Mock-Object dient. Das aber kann nur funktionieren, wann Ableiten erlaubt ist. Hier kann GLUONJ Abhilfe schaffen …

Weiterlesen

Veröffentlicht unter Java | Hinterlasse einen Kommentar

Native Windows-FileChooser mit JNative

Swing-FileChooser

Der Swing-FileChooser hat selbst in der Version 6 von Java immer noch nicht das Niveau des nativen FileChoosers erreicht. So steht bespielsweise die wichtige Miniaturansicht für Bilder bei Swing nicht zur Verfügung. Auch das Auswahl “Lasso” bei mehrfach Auswahl fehlt bei der Java-Variante.

JNative

Mit JNative gibt es eine einfache Möglichkeit native Code in Java einzubinden, ohne dafür gleich JNI oder den C/C++ Compiler bemühen zu müssen. Der native Code in der DLL (oder dem SO-Modul) ist generisch und ein Call an eine Betriebsystemfunktion wie “GetOpenFile” wird sozusagen in Java “zusammengebaut”.

Weiterlesen

Veröffentlicht unter Java | Hinterlasse einen Kommentar

DocBook Publishing mit OpenOffice

Einfacher …

Anläßlich einer Anfrage zum meinem Artikel habe ich das damals doch recht komplizierte Zusammenspiel von ANT, Python und Java einmal refakturiert und in eine einfache Java-Anwendung gegossen.

Herausgekommen ist eine kleine Kommandozeilen Applikation, die aus einer OpenOffice-Datei (altes SXW-Format, kein ODT) eine Docbook XML-File erzeugt, alle Bilder extrahiert und die Links anpasst. Weiterhin wird auf Wunsch auch gleich das 1-Seiten-Html und das mehrseitige HTML erzeugt. PDF und weitere lassen sich leicht ergänzen.

Weiterlesen

Veröffentlicht unter Java | Hinterlasse einen Kommentar

Testen mit HttpUnit und Spring

Beim Testen mit HttpUnit und Spring müssen die Servlets und Filter, die über Spring konfiguriert werden mit ihrem Context versorgt werden. Nimmt man hierzu den “normalen” Context-Listener von Spring, hat das den Nachteil, dass bei jedem Start des HttpUnit-ServletContainers der Context neugeladen wird, was unter Umständen viel Zeit in Anspruch nimmt.

Context cachen

Das Zwischenspeichern des Context ist erforderlich und ähnlich wie Spring selbst Basisklassen mit dieser Eigenschaft anbietet, kann auch ein ContextListener geschrieben werden, der den Context speichert und für viele Testruns zu Verfügung stellt.

Weiterlesen

Veröffentlicht unter Java | Hinterlasse einen Kommentar

Generisches Spring-Servlet

Manchmal braucht man neben den MVC Mechanismen von Spring-Web auch ein ganz normales Servlet, welches nicht einem Handler entspricht, der ModelAndView zurückgibt. Leider ist so ein Servlet dann aber selbst keine Spring-Bean, sondern muss sich selbst des Spring-Contexts bedienen, um an die Spring-Beans heranzukommen und Dependencies zu setzen.

Ein generisches Spring-Servlet, welches auf eine Servlet-Spring-Bean delegiert, schafft Abhilfe …

Weiterlesen

Veröffentlicht unter Java | 2 Kommentare

Contract first?

Gestern abend bin ich zufällig über eins der Sub-Projekte von Spring gestolpert: Spring-WS (Spring WebServices). Beim Lesen der Dokumentation stach mir die Behauptung ins Auge "Best Practice made easier", gemeint ist ein Contract-First Ansatz und das Arbeiten direkt mit den XML-Nachrichten.

In einem eigenen Abschnitt wird ausgeführt, warum (speziell im Falle von WebServices) der Contract-First Ansatz der Bessere ist:

Zum einen lassen die Type-Definitionen mit XML Schema Konstruktionen zu, die in Java (um diese Sprache geht es hier ;-)) gar nicht möglich sind.

Zum anderen lassen bestimmte Sprachkonstrukte, wie zyklische Bezüge nicht einfach so nach XML abbilden.

Deshalb, so die Schlussfolgerung, sei es das Beste, direkt mit den XML-Nachrichten zu arbeiten. Hierfür gibt’s ja schließlich eine Reihe von APIs mit denen sich das einfach bewerkstelligen läßt.

Als krönender Abschluss wird, im Falle einer neuen Version des Contracts und damit anderer XML-Nachrichten, auf die Möglichkeit verwiesen, diese unter Umständen ganz einfach mit XSLT wieder auf die "Old-Style"-Nachricht abzubilden, und somit müßte man nicht mal eine neue Java-Implementierung schreiben.

Geht’s noch …

In der Tat, um mal beim letzten Punkt anzufangen, man braucht keine neue Java-Implementierung und auch kein neues Java-Interface, aber dafür ein XSLT-Stylesheet. Und wenn das dann nicht so arbeitet, wie man gedacht hat, dann baucht man einen Debugger für die Transformation-Engine, damit man sieht wo es schief geht ….

Weiterlesen

Veröffentlicht unter Java | Hinterlasse einen Kommentar

Bytecode Instrumentation mit JavaAgent für Logging und Debugging

JavaAgent

Bereits seit Java 5 besteht die Möglichkeit mit der JVM Option -javaagent eigene Klasse in das Klassenladen der VM einzuklinken und so zu verändern bevor diese ausgeführt werden. AspectJ nutzt das z.B. um Aspekte auf Bytecode Ebene "einzuweben".

Logging und Debugging

Ein schönes OpenSource Tool, welches sich diese Möglichkeit ebenfalls zu Nutze macht, ist: LimpidLog

Weiterlesen

Veröffentlicht unter Java | Hinterlasse einen Kommentar

ImageViewer mit Slideshow und Multiple Monitor Support

Slideshow auf zweitem Monitor?

Leider gibt’s das so gut wie gar nicht, das einzige was ich finden konnte ist der FastStone ImageViewer. Der hat allerdings so seine Macken beim Abspielen von ganzen Verzeichnissen und noch so ein paar Seltsamkeiten. Also was tun? Selber machen!

ImageViewer in Java

Auch für Java ist das Angebot gross, wenn man einen Bildbetrachter sucht, leider kann kein einziger seine Slideshow auch auf einem zweiten Monitor darstellen. Wenn man jedoch die APIs studiert, stellt man fest, dass Bilder laden und anzeigen eh nur ein Zweizeiler ist und auch das Umschalten in der FullScreen-Mode geht seit Java 1.4 ganz einfach …

Weiterlesen

Veröffentlicht unter HomeCinema, Java | Hinterlasse einen Kommentar

JSF Spring Integration

JSF Spring Integration

Bislang gab es vor allem zwei Ansätze JSF und Spring einander näher zu bringen:

  1. Der Spring eigene DelegatingVariableResolver
  2. JSF-Spring

Erstere liefert über einen Custom Variable Resolver die Möglichkeit auf Spring-Beans aus JSF (mit Hilfe der ExpressionLanguage) zuzugreifen.

JSF-Spring fügt dann noch die Möglichkeit hinzu auch von Spring aus auf JSF zugreifen zu können.

Aber mit Spring 2.0 braucht man das eigentlich gar nicht mehr …

Weiterlesen

Veröffentlicht unter Java | 4 Kommentare