Poruszanie się w obrębie własnego konta

0

Cześć,

Chcę zrobić aplikację w której użytkownicy mieliby swoje konta. I teraz mam taki problem, że nie wiem w jaki sposób użytkownik docierałby tylko do treści na swoim koncie. Jak to zrobić żeby połączyć to z frontendem i wiadomo było że dane dajemy tylko dla użytkownika na którym jesteśmy zalogowani. Czy z pomocą przychodzi tutaj spring security?

Moglibyście podesłać jakieś materiały dotyczące tego zagadnienia?

Z góry dziękuję i pozdrawiam

2

Hasło do obczajenia: ACL.
Wprawdzie sam Javy nie używam (więc mogę być w błędzie), ale rzuć okiem na ten link, może będzie przydatny - https://www.baeldung.com/spring-security-acl.

1

Tak, Spring Security: https://spring.io/guides/tutorials/spring-security-and-angular-js/

Nie jest to najprzyjemniejszy framework do współpracy, szukaj przykładów jak ten powyżej i klej ;)

Jak to działa w skrócie: po uwierzytelnieniu z każdym requestem HTTP powiązana jest informacja o użytkowniku, w imieniu którego ten request ma być wykonany na serwerze (np. za pomocą Cookie). Spring Security rejestruje dedykowany filtr, który sprawdza tę informację i inicjalizuje pewne struktury danych (tzw. security context), które dostarczają informacji o uprawnieniach użytkownika na każdym etapie przetwarzania requestu. Na to jest cała masa nakładek, adnotacji i innych cudów, ale sens jest ten sam. Tutaj więcej info: https://spring.io/guides/topicals/spring-security-architecture

W miarę łatwo daje się spiąć Spring Security z social login, np. przez Fb albo Google. Dzięki temu nie musisz kodować tworzenia konta.

1

Co prawda zupełnie inny był cel tego projektu, ale masz tam przykład z obsługą tokenów jwt -> https://github.com/Pharisaeus/almost-s3

1

Trochę zbyt ogólnie zadałeś pytanie, bo temat jest dość szeroki, w zależności od tego co w rzeczywistości chcesz zrealizować. Możesz mieć prostą sytuację, kiedy każdy użytkownik ma dostęp do "swoich danych", może też mieć dostęp do danych organizacji (multitenancy), może mieć dostęp do danych ogranizacji + dodatkowe warunki w zależności od tego kim jest (może przeglądać zdjęcia wszystkich użytkowników, ale dodawać jedynie własne), na to wszystko może się jeszcze nałożyć rola użytkownika (administrator, zwykły użytkownik itd.). Na to wszystko mogą się nałożyć wymagania klienta co do sposobu przechowywania danych i np. zażyczyć sobie szyfrowania danych indywidualnym kluczem.

Nie mniej musisz mieć następujące elementy w całym procesie obsługi requesta:

  • uwierzytelnianie (kim jest użytkownik)
  • autoryzacja (określenie jakie ma prawa)
  • kontrola dostępu do danych (czy to co wiemy o użytkowniku na podstawie powyższych punktów upoważnia go do wykonania operacji, której zażądał)

To w jaki sposób zrealizować te kroki to już kwestia wyboru konkretnej technologii, w zależności od tego jakie są faktyczne wymagania i jaką architekturę całości chcesz mieć. Popularne podejście to użycie tokenów JWT, czyli:

  • Frontend pyta użytkownika o podanie login/password
  • uderza do jakiegoś serwera po token JWT i dostaje coś na kształt:
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
  • zapisuje sobie ten token "w pamięci"
  • przy kolejnym żądaniu o dostęp do profilu GET https://acme.com/profile/1234567890 dodaje nagłówek Authorization: Bearer {token}
  • serwer dostaje żądanie i sprawdza integralność tokenu (czy nie został zmieniony, czy jest podpisany zaufanym kluczem)
  • wyciąga z tokenu sub użytkownika 1234567890
    wykonuje kawałek, w tym przypadku prostego kodu:
if(sub != profileId){
  throw new UnauthorizedException()
} else {
  return repository.getProfile(profileId)
}

Zastrzeżenie - to jest uproszczony flow. Doczytaj o autoryzacji z pomocą JWT, bo handshake zwykle jest bardziej złożony, może być realizowany przez więcej niż 1 serwer, rozdzielać uwierzytelnianie od autoryzacji. Te kroki po stronie serwera można zapakować w Spring Security, w całości bądź w części, pytanie czy warto.

1 użytkowników online, w tym zalogowanych: 0, gości: 1