Logowanie w Springu

0

Hej,
Cały czas uczę się Springa i nawet mam działającą aplikację, niemniej jednak chciałabym troszkę ulepszyć kwestię authentykacji.
Obecnie używam Basic Authentication i mam skonfigurowane URL "chronione". Jednakże po stronie klienckiej zrobiłam coś co ma przypominac "logowanie". Normalna forma w kliencie i po kliknieciu na login idzie request do mojej aplikacji Springowej (RestApi) i tam mam własnie taką prowizoryczną metodę login, która w zasadzie nic nie robi. Jej URL jest dodane jako "authenticated" więc jeśli user będzie chciał się do niej dobrać, a nie poda prawidłowego hasła to odbije się od AccessDeniedHandlera.

Aczkolwiek jest to taki bardziej workaround. Moje pytanie brzmi, jak powinno to być zrobione prawidłowo ? A może powinnam wprowadzić obsługe sesji ?

0

Do prostych rzeczy w REST API basic auth jest ok. Jak robisz coś prostego dla siebie nie ruszałbym. Jest to bezstanowe, więc skalowalne. Do prostych nawet produkcyjnych zastosowań może wystarczyć certyfikat, SSL i nie trzeba nic więcej.

Jak tworzysz front to w localstorage przeglądarki można jakoś trzymać login i hasło odpowiednio zaszyfrowane (to nie jest bezpieczne, ale takie życie). Potem doklejać je do każdego requesta.

Używanie sesji to zły pomysł i anty-pattern. Jak masz sesje prosty load balancer do skalowania aplikacji nie wystarczy: trzeba budować klaster i replikować sesję (skomplikowana operacja, której warto uniknąć).

W poważniejszych zastosowaniach użyłbym OAuth2 i tokenów. Token i tak trzymać trzeba w local storage. Masa przykładów w sieci jak to skonfigurować. Wiadomo, jak ktoś ukradnie token to jest problem.

0

W tej chwili Clientem jest applikacja JavaFX wiec i tak trzymam dane logowania w aplikacji i doklejam do kazdego requesta. Więc to logowanie jest taką tylko prowizorką. Niemniej jednak tu rodzi się pytanie. Na jakim etapie szyfrować hasło. Bo w tej chwili mam encoder w aplikacji springowej, żeby w bazie zapisywało się w postaci zaszyfrowanej.
Ale to haslo w headerze przecież przychodzi jedynie zakodowane w bae64, jak to powinnam rozwiązać ?

1

Basic auth nigdy nie będzie bezpieczne. Można liczyć na jakość SSL/TLS: szyfrowanie na poziomie protokołu sieciowego HTTPS. Czyli wyścig z łamaczami zabezpieczeń. Liczysz na certyfikaty. Jak to nie jest soft produkcyjny to bym się nie przejmował. Jak produkcyjny to używanie tokena zamiast jawnej kombinacji nagłowek:hasło utrudnia życie włamywaczowi. Na potrzeby deweloperskie możesz sobie podpisać certyfikat samodzielnie. Przekazując token i tak trzeba użyć HTTPS.

Jak zapisujesz hasło w bazie niezależnie od użytej funkcji skrótu pamiętaj o zasoleniu hasła.

0

No nie jest to aplikacja biznesowa. Raczej rozrywkowa. Aczkolwiek chciałabym w przyszłości postawić ten serwer i udostępnić go zewnętrznie dla użytkowników. Dlatego tez zastanawiam sie jak najlepiej rozwiązać tu kwestie autentykacji.

1

Potraktuj problem iteracyjnie: najpierw zrób, aby działało basic auth + SSL, jak będzie czas dodaj obsługę OAuth2 (polecam JWT jako format tokenu).

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