2017-02-20 2 views
1

Hallo, ich habe einige Probleme beim Einsatz von Feder Sicherheit in Gewinden UmfangFedersicherheits aktuelle Benutzer in Thread

System.out.println(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId()); 
new Thread(() -> System.out.println(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId())).start(); 

diese zwei Linien mir wie erwartet aktuelle Benutzer-ID geben sollen

die erste Zeile der Arbeit

die zweite Zeile gibt mir NullPointerException, da es keinen aktuellen Benutzer gibt es Nullwert

Ich habe dieses Problem gefunden, da ich viele Zeilen zu t speichern möchte er Song Tisch und es @CreatedBy Benutzer hava, und dies wird für den aktuellen Benutzer in Thread stellen und wird fehlschlagen, da diese Null-Wert für den aktuellen Benutzer geben

+1

Warum wollen Sie einen separaten Thread haben wollen für immer der aktuelle Benutzer? Tun Sie es wie in der ersten Option vorgeschlagen. –

+0

Standardmäßig wird das Spring Security-Objekt "Authentication" in einer ThreadLocal-Datei auf einer "Thread" -Basis gespeichert. Wenn daher ein neuer Thread mit "new Thread" ausgelöst wird und dann versucht wird, das "Authentication" -Objekt innerhalb des neuen Threads abzurufen, wird "null" zurückgegeben. Die offizielle Spring Security-Dokumentation bietet [mehrere Optionen] (http://docs.spring.io/spring-security/site/docs/current/reference/html/concurrency.html) für die Arbeit in einer Umgebung mit mehreren Threads. Überprüfen Sie die Dokumentation und wählen Sie die für Ihre Umgebung geeignete Strategie aus. – manish

+1

warum willst du einen separaten Thread haben, um den aktuellen Benutzer zu bekommen ¿weil ich nicht rufe, bekomme aktuellen Benutzer die createdby Annotationen, die es aufrufen und es in einem Thread aufrufen, dass ich erstellt worden bin, damit dies von Frühlingsmagie getan wird –

Antwort

2

Wenn Sie gelaicht Fäden SecurityContext des Mutter Thread erben wollen, sollten Sie festlegen MODE_INHERITABLETHREADLOCAL Strategie.

Siehe API SecurityContextHolder.

Siehe this zu

2

Sie die Security von einem Thread zu einem anderen

Runnable originalRunnable = new Runnable() { 
public void run() { 
    // invoke secured service 
} 
}; 
SecurityContext context = SecurityContextHolder.getContext(); 
DelegatingSecurityContextRunnable wrappedRunnable = 
    new DelegatingSecurityContextRunnable(originalRunnable, context); 

new Thread(wrappedRunnable).start(); 

See Concurrency-Support übertragen

http://docs.spring.io/spring-security/site/docs/current/reference/html/concurrency.html

Verwandte Themen