Erstellen einer benutzerdefinierten Jasypt-Eigenschaftsquelle in Springboot

8

Ich verwende Spring Boot, um eine einfache Webanwendung zu erstellen, die auf eine Datenbank zugreift. Ich nutze die Autokonfigurationsfunktion für die DataSource, indem ich spring.datasource.* properties in application.properties einstelle. Das alles funktioniert hervorragend und war sehr schnell - tolle Arbeit Jungs @ Spring!

Die Richtlinie meines Unternehmens besagt, dass es keine Klartextkennwörter geben sollte. Daher muss die sping.datasource.password verschlüsselt sein. Nachdem ich ein bisschen gegraben habe, habe ich beschlossen, eine org.springframework.boot.env.PropertySourceLoader -Implementierung zu erstellen, die wie folgt eine jasypt org.jasypt.spring31.properties.EncryptablePropertiesPropertySource erstellt:

%Vor%

Ich verpackte das dann in einem eigenen Jar mit einer META-INF/spring.factories -Datei wie folgt:

%Vor%

Dies funktioniert perfekt, wenn es von maven mit mvn spring-boot:run ausgeführt wird. Das Problem tritt auf, wenn ich es als eigenständigen Krieg mit java -jar my-app.war ausführen. Die Anwendung wird weiterhin geladen, schlägt jedoch fehl, wenn ich versuche, eine Verbindung zur Datenbank herzustellen, da der Kennwortwert weiterhin verschlüsselt ist. Das Hinzufügen der Protokollierung zeigt, dass EncryptedPropertySourceLoader niemals geladen wird.

Für mich klingt das nach einem Klassenpfadproblem. Wenn sie unter maven ausgeführt wird, ist die Reihenfolge der JAR-Ladevorgänge strikt, aber einmal unter dem eingebetteten Tomcat gibt es nichts zu sagen, dass meine benutzerdefinierte JAR-Datei vor dem Spring Boot geladen werden sollte.

Ich habe versucht, meiner pom.xml Folgendes hinzuzufügen, um sicherzustellen, dass die classpth erhalten bleibt, aber anscheinend keine Wirkung hatte.

%Vor%

Hat jemand Ideen? Vielen Dank im Voraus.

UPDATE:

Ein Schritt vorwärts: Ich habe es geschafft, das zu beheben, indem ich die EncryptedPropertySourceLoader Klasse org.springframework.core.PriorityOrdered interface implementiert habe und HIGHEST_PRECEDENCE von getOrder() zurückgegeben habe. Dadurch wurde das Problem behoben, dass der PropertySourceLoader nicht verwendet wurde. Beim Versuch, die Eigenschaften zu entschlüsseln, wird jetzt folgender Fehler ausgegeben:

%Vor%

Auch dies geschieht nicht beim Ausführen von mvn spring-boot:run , passiert aber beim Ausführen von der ausführbaren WAR-Datei. Beide Szenarien verwenden die gleiche JVM (jdk1.6.0_35). Die Ergebnisse bei Google / Stackoverflow deuten darauf hin, dass dies ein Problem mit der Java-Sicherheitsrichtlinie ist, aber da es funktioniert, wenn es von maven ausgeführt wird, denke ich, dass ich das ablehnen kann. Möglicherweise ein Verpackungsproblem ...

    
Mudged 27.06.2014, 11:49
quelle

2 Antworten

5

Hier gibt es zwei Probleme.

1) Der EncryptedPropertySourceLoader muss höher als der Standard PropertiesPropertySourceLoader geladen werden. Dies kann durch die Implementierung der PriorityOrder-Schnittstelle wie folgt erreicht werden:

%Vor%

Die Klasse org.springframework.core.io.support.SpringFactoriesLoader , die org.springframework.boot.env.PropertySourceLoader von META-INF/spring.factories lädt, sortiert die Ergebnisse mit org.springframework.core.OrderComparator . Dies bedeutet, dass diese Klasse zuerst zurückgegeben werden sollte und die Verantwortung für die Bereitstellung der PropertySourceLoader-Implementierung für * .proerpties-Dateien übernehmen wird.

2) Die zweite ist ein Problem beim Laden der Klasse mit der ausführbaren JAR / WAR, das anscheinend durch einen Fehler in Version 1.1.2.RELEASE von Spring Boot unter Windows verursacht wurde. Das Ablegen auf Version 1.1.1.RELEASE oder auf Version 1.1.3.RELEASE löst die verschiedenen Probleme mit Klassen und Properties, die nicht geladen werden, wenn sie außerhalb von Maven ausgeführt werden.

    
Mudged 30.06.2014, 08:48
quelle
6

Du könntest es versuchen: jasept-spring-boot Im Grunde werden alle in der Umgebung vorhandenen PropertySource mit einer verschlüsselbaren Version umschlossen. Die zwei Dinge, die Sie nach dem Import der Bibliothek tun müssen (Hinzufügen der Abhängigkeit, wenn Sie maven verwenden), besteht darin, Ihre @Configuration-Klasse mit @EnableEncryptableProperties zu kommentieren und den Verschlüsselungsalgorithmus und das Passwort über Eigenschaften zu konfigurieren.

    
Ulises 27.05.2015 23:26
quelle

Tags und Links