Java-Bug in Modulsystem bei Nutzung von JAAS

vorhergehende Artikel in: Java Software-Test Rants
20.02.2018

Ich stand und stehe immer noch der Implementierung des Modulsystems in Java9 ablehnend gegenüber. Neulich war es draußen so, dass ich lieber drin blieb und ich erinnerte mich an eine Test-Suite, die ich bei der Umstellung auf Java8 dazu nutzte, Imkompatibilitäten meiner Anwendungen festzustellen und auszumerzen.

Zu den Test-Themen zählten unter anderem:

  • Custom ClassLoader
  • Java3D
  • JAAS
  • Java Webstart (als Server und Client)

Ich reaktivierte also diese kleinen Tests und ließ mich überraschen. Tatsächlich wurde ich auch überrascht: der JAAS-Test schlug fehl. Ich brauchte einige Zeit, dahinterzukommen warum er fehlschlug.

Dazu vielleicht zunächst ein wenig Hintergrund: Das JAAS-Szenario sah so aus, dass ich darüber die Authentifizierung realisierte. Dadurch wird ein Principal aufgebaut, der dann vom SecurityManager benutzt wird um zu prüfen, ob der Code, der gerade ausgeführt wird, auch über die entsprechende Permission verfügt.

Ich benutzte zur Erstellung des Prinzipals den com.sun.security.auth.module.UnixLoginModule. Unter Java8 funktionierte der Test problemlos, unter Java9 wurden keinerlei Permissions vergeben.

Nach langwieriger Suche stellte sich die Situation für mich so dar, dass Oracle selbst das neue Modulsystem nicht restlos durchschaut, denn im Zuge der Arbeit des SecurityManager wird an den Principals die Methode hashCode aufgerufen - die wiederum die Methode toString aufruft, um den Hash aus dem resultierenden String zu errechnen.

Da die Methode toString jedoch die Stringrepräsentation aus ResourceBundles (Stichwort I18n) zusammensetzt, fliegt unter Java9 eine ResourceNotFoundException, weil das benötigte ResourceBundle nicht im Klassenpfad gefunden werden kann.

Das wirklich witzige daran ist, dass man diesen Fehler umgehen kann, wenn man direkt nach dem Login alle Principals des Subject holt und an jedem vorsorglich einmal die toString-Methode aufruft. Zu diesem Zeitpunkt weiß Java noch, wo das ResourceBundle im ClassPath liegt und das sorgt dafür, dass die Ressourcen dann auch gefunden werden, wenn der SecurityManager sie benötigt.

Die Dateien zum Nachvollziehen sind angehängt: Unter Java8 funktioniert die Beispielanwendung mit oder ohne Kommandozeilen-Parameter, unter Java9 funktioniert sie nur mit Kommandozeilenparameter - das schaltet nämlich den Workaround an...

Die Anwendung muss mit den drei System-Properties

  • java.security.auth.login.config
  • java.security.manager
  • java.security.policy
gestartet werden, damit JAAS entsprechend konfiguriert wird und der SecurityManager über die Rechte des Principals informiert ist.

Ich habe nicht versucht, ob derselbe Mechanismus mit denselben fatalen Folgen unter Windows zum Tragen kommt.

Ein entsprechender Bug wurde gemeldet und ist zur Zeit intern unter Review.

JAAS-Konfiguration
Security-Policy
Beispielanwendung

Aktualisierung vom 20. Februar 2018

Der Bug wurde unter JDK-8198352 in die Java Bug Database aufgenommen.

Artikel, die hierher verlinken

Rechtevergabe in Java

04.11.2018

Eine Klarstellung zum Thema Java, SecurityManager, Principals und Permissions

Java9 Umstellung

16.04.2018

Die Umstellung auf Java9 in meinen eigenen Projekten ist abgeschlossen

Änderungen im Datumsformat von Java - schon wieder!

25.02.2018

Ich habe bereits über einen Bug in Java9 berichtet, der mich ziemlich überrascht hat. Wer aber beschreibt meine Überraschung, dass der Bug, der mich beim Umstieg von Java7 auf Java8 bereits angespuckt hat, wieder Speichel gesammelt hat?

Batik und Java9 Modulsystem = ☠

25.02.2018

Nachdem ich bereits über den einen oder anderen Bug in Verbindung mit Java 9 berichtet habe, habe ich bereits wieder einen gefunden - und wieder verbunden mit der ach so tollen Erfindung des Java-Modulsystems

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Mandelbrot-Sets mittels Shadern berechnen

    17.05.2019

    Nachdem ich in den letzten verregneten Tagen auf Youtube in den Videos von Numberphile versunken bin, hat mich eines davon angestachelt, mich selbst mit dem Mandelbrotset zu beschäftigen. Als ich dann noch Code fand, der behauptete, das auf einer Graphikkarte mittels Shadern berechnen zu können, war es um mich geschehen...

    Weiterlesen...

Neueste Artikel

  • Erste Vor-Version eines Gis-Plugin für die sQLshell

    Wie bereits in einem früheren Artikel erwähnt plane ich, demnächst ein Plugin für die sQLshell anzubieten, das eine Visualisierung von Daten mit räumlichem Bezug im Stil eines Geoinformationssystems erlaubt.

    Weiterlesen...
  • bad-certificates Version 2.1.0

    Das bereits vorgestellte Projekt zur automatisierten Erzeugung von Zertifikaten mit allen möglichen Fehlern hat eine Erweiterung erfahren und verfügt über ein Partnerprojekt - beide sind nunmehr in der Version 2.1.0 freigegeben

    Weiterlesen...
  • SQLite als Geodatenbank

    Wie bereits in einem früheren Artikel beschrieben treibe ich derzeit Anstrengungen voran, die sQLshell attraktiver für Nutzer zu machen, die mit Geodatenbanken arbeiten.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.