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 Security jak wyciągnąć i gdzie przetrzymać userId
- Rejestracja: dni
- Ostatnio: dni
- Postów: 46
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2787
Spring umożliwia właśnie statyczne dobranie się do aktualnie zalogowanego użytkownika:
SecurityContextHolder.getContext().getAuthentication()
- Rejestracja: dni
- Ostatnio: dni
- Postów: 46
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?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2787
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 63
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();