Cześć,
Piszę apkę microservisową i w kilku miejsach będę potrzebować ID usera do filtrowania itd. Myślę w jaki sposób to zrobić, nie chcę za każdym razem kiedy tego potrzebuje uderzać do bazy, poza tym fajnie jakby servisy były od siebie niezależne. Myślałem o tym żeby zaraz po zalogowaniu Usera zapisać jego ID gdzieś, może w sesji.. tak żeby wszystkie serwisy w każdym momencie mogły wyciągać te ID. Możecie mi coś doradzić jak rozwiązać taki problem i czy dobrze kombinuje?
Spring umożliwia właśnie statyczne dobranie się do aktualnie zalogowanego użytkownika:
SecurityContextHolder.getContext().getAuthentication()
Pinek napisał(a):
Spring umożliwia właśnie statyczne dobranie się do aktualnie zalogowanego użytkownika:
SecurityContextHolder.getContext().getAuthentication()
Tak, zgadza się, i scenariusz jest taki że wyciągam dzięki temu username, a potem metoda na bazie findUserByUsername, i tak mogę zdobyć id. Jednak zależy mi na tym żeby taką operację wykonać RAZ, a nie za każdym razem wykonywać taki ciąg operacji żeby pobrać to ID.. Zwłaszcza że taką operację dostarcza jeden serwis z wielu, i nie chciałbym żeby wszystkie inne serwisy wołały co chwilę ten jeden. Masz jakiś pomysł jak to zrealizować? Tak aby po zalogowaniu użytkownika pobrać raz jego id, zapisać gdzieś i mieć do tego dostęp cały czas i wszędzie?
Proponuję stworzyć springowy component, w którym przechowujesz mapę usernamów na ich idki - przy starcie apki ta mapa będzie pusta, a za każdym razem jak będziesz chciał id usera na podstawie username, to będziesz patrzył w tę mapę -> jeśli wartość będzie nienullowa, to zwracasz dany id, a jeśli null, to będzie znaczyć, że jeszcze nie pobraliśmy tego usera, więc wykonać trza będzie calla do bazy.
Poniższe zwraca obiekt który wykorzystałeś przy uwierzytelnianu. Rzutujesz go na klasę na której zaimplementowałeś UserDetails. Ja w tym miejscu zwykle trzymam Id zalogowanego użytkownika.
SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Masz jakieś API Gateway czy front ma strzelać bezpośrednio do serwisów? Chcesz sesje współdzielić między mikroserwisami?