Wpis z mikrobloga

Hej
Zastanawiam się jak w aplikacji opartej o spring boota + spring security + vaadin rozwiązać problem by użytkownik miał dostęp tylko do swoich zasobów z db.

Załóżmy, że mamy aplikację typu CRUD (jakąś todo listę). Pierwotnie zakładałem, żeby w warstwie service wyciągającej zadania użytkownika (po id lub po jakiejś jego nazwie) z repozytorium springowego (w oparciu o hibernate) jakoś wyciagać id zalogowanego użytkownika i przekazywania go do metody (zdefiniowanej w interfejsie implementujacym crud repository) typu getTaskById (zakładając, że każdy rekord w tabeli Tasks ma kolumnę typu owner_id z ID użytkownika do którego należy zadanie).

Pytanie jak się aplikacja zachowa w momencie gdy naraz będzie zalogowanych więcej użytkowników?
A może spring security (podejrzewam, że tak) oferuje już gotowe mechanizmy do rozwiązania tego problemu?
Będę wdzięczny za naprowadzenie na rozwiązanie jak to zrobić dobrze.
#java #programowanie #naukaprogramowania #spring
  • 6
Pytanie jak się aplikacja zachowa w momencie gdy naraz będzie zalogowanych więcej użytkowników?


@Generyczny_nick: normalnie, każdy z tych użytkowników będzie 'istniał' w obrębie własnego kontekstu.

A może spring security (podejrzewam, że tak) oferuje już gotowe mechanizmy do rozwiązania tego problemu?


@Generyczny_nick: Spring Security JEST gotowym mechanizmem do rozwiązywania tego typu problemów:

https://spring.io/guides/topicals/spring-security-architecture
@Generyczny_nick: Spring Securty dostarcza sporo mechanizmów, które mogą to rozwiązać. Najprościej jest zrobić w repo metodę getTodosByUserName(String username) a w kontrolerze najpierw ze Spring Security pobrać nazwę obecnie zalogowanego użytkownika, a później wywolać w/w metodę i zwrócić wynik.
Pamiętaj, że każdy użytkownik ma swoją sesję, więc nazwa użytkownika zwrócona przez Spring Security będzie za każdym razem odzwierciedlała osobę, która wykonała request.
dodatkowe operacje po udanym zalogowaniu (np. pobranie ID z bazy, lub całego obiektu usera), możesz wykonać implementując AuthenticationSuccessHandler i użyć tej implementacji w SecurityConfigu.
Pytanie jak się aplikacja zachowa w momencie gdy naraz będzie zalogowanych więcej użytkowników?


@Generyczny_nick: Standardowo aplikacje oparte o servlety (w tym spring boot uruchamiany m.in. w oparciu o Tomcata) każde żądanie HTTP obsługuje w osobnym wątku. Twoim zadaniem jest napisanie bezstanowych klas tak aby nie miało znaczenia w jakim wątku wywołasz springowego beana.

Sposobów na autentykację/autoryzację jest kilkadziesiąt i Spring Security pokrywa wszystkie najpopularniejsze.

Spring Security może dać Ci info o