So erstellen Sie einen mit Singleton-scoped-Objekt-Thread-Safe (Guice + Owasp ESAPI)
-
25-10-2019 - |
Frage
Ich verwende derzeit die OWASP -ESAPI, um die Authentifizierung in meiner Java -Webanwendung zu verwalten, und injiziere den Singleton MyAuthenticator mit Guice.injectMembers (this). Ich möchte mich von diesem Ansatz entfernen und ein von Guice geschaffenes Singleton-Scoped-Objekt verwenden. Ich mochte die Thread-Safety des Esapi-Singleton und die Sicherheit von Singletons im Allgemeinen, indem ich doppelt überprüfte Verriegelung, Iodh-Idiom oder Blochs Enum-Instanzstil verwendete.
Was muss ich mit meinem mit dem Guizenzierten, mit dem Singleton gescopten Authentikator tun, um ihn zu thread-sicher zu machen, sowie mit dem ThreadLocal-Feld, das ich verwende, um meinen aktuellen Benutzer zu erhalten und festzulegen?
Ich möchte die gesamte Anwendung mit Abhängigkeitsinjektion funktionieren, möchte aber nicht, dass sie den gleichzeitigen Zugriff auf Web-Apps brechen. Irgendwelche Vorschläge oder gemeinsame Fallstricke?
Das ThreadLocal -Objekt, das ich verwende, sieht aus wie der Code unten:
private final ThreadLocalUser currentUser = new ThreadLocalUser();
private class ThreadLocalUser extends InheritableThreadLocal<User> {
@Override
public User initialValue() {
return User.ANONYMOUS;
}
public User getUser() {
return super.get();
}
public void setUser(User newUser) {
super.set(newUser);
}
}
Lösung
Leider weiß ich nicht genug über Owasp ESAPI, um eine bestimmte Antwort zu geben, aber Sie haben vielleicht etwas Glück, mit der AOP -Unterstützung von Guice zu suchen. Sie können alle Methodenaufrufe in der Klasse abfangen und das, was Sie mögen.
Andere Tipps
Achten Sie auf das Muster "Double-Check Locking" in Java. Dieses Entwurfsmuster funktioniert nicht zuverlässig in Java (zum Beispiel siehe http://www.cs.umd.edu/~pugh/java/Memorymodel/DoublCheckedLocking.html) wenn nicht Sie deklarieren die Singleton -Instanz als "flüchtig".