Spring - autentykacja.

Spring - autentykacja.
AI
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 3 lata
  • Postów:375
0

Załóżmy sytuację, gdy użytkownik chce sprawdzić, czy istnieje użytkownik o podanym username i password (mam to opakowane w klasę LoginForm). Jak dać użytkownikowi możliwość sprawdzenia, czy dane są poprawne? Próbowałem to zrobić przy pomocy Get wraz z RequestBody LoginForm, ale w chwili gdy napotkałem problemy w postmanie (nie mogłem dodać RequestBody do metody Get) przeczytałem, że Get nie powinien przyjmować RequestBody. Więc jak dać użytkownikowi taką możliwość? Czy Spring Security mi w tym pomoże?

Drugie pytanie: Chciałem uniknąć tworzenia sesji z użytkownikami, gdzie w zmiennych sesyjnych przechowywałbym np zalogowanego Usera, więc wpadłem na pomysł, żeby podczas wywoływania "każdej" (każdy wymagający potwierdzenia, że Użytkownik rzeczywiście może np. dodać ofertę) z metod UserControllera musi być podany formularz z loginem czyli metody mniej-więcej wyglądają tak:

Kopiuj
 @PostMapping("/order")
    public ResponseEntity addOrder(@RequestBody LoginForm loginForm, @RequestBody OrderDTO orderDTO){
    //jeżeli w bazie danych znajdzie się użytkownik o podanym Username i Password (pola LoginForm) to OrderDTO zostanie zmapowane do Order i wykonana pozostała część metody
    }

Czy jest to poprawne?

Trzecie pytanie: Jak zabezpieczyć system, przed "wykonywaniem' metody sprawdzającej poprawność username i password? Zdaję sobie z tego sprawę, że wysyłając tylko taki Request dostaje się w bardzo krótkim czasie odpowiedź, czy hasło i nick są poprawne, więc można byłoby najpierw sprawdzić czyjś nick, a następnie metodą prób i błędów losować hasła do czasu aż nie dostanie się statusu 200.

AK
Nie myślisz o JWT? Otwórz YT "bezpieczny wypoczynek w REST"
AI
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 3 lata
  • Postów:375
0

@AnyKtokolwiek oglądnąłem i po obejrzeniu, skłaniam się ku zrezygnowaniu z LoginForm (czy generowania jakiegoś Tokena) na rzecz ustanowienia sesji z użytkownikiem (za względu, że jest badziej bezpieczna) i przechowywania w jakiejś klasie (np UserSession) Optionala z zalogowanym Userem i w zależności czy uderzając pod endpoint (z metodą PUT) odpowiedzialny za logowanie (zapisanie do Optionala konkretnego Usera) tylko zastanawiam się czy, w tym przypadku, sesja nie okazałaby się zbyt ciężka (mimo, że jest to projekt tylko na githuba + może na pracę inżynierską).

Tylko to rozwiązuje problem z drugim pytaniem, tzn dostałem odpowiedź że jest to poprawne tylko zamiast LoginForm jakiegoś Tokena bym musiał przekazać. Na pytanie trzecie też pobieżnie była odpowiedź w podanym filmie, żeby ustalić delay 200ms. Tylko jak to ustawić? Czy ustawienie tego to ustawienie odpowiednio serwera (np Tomcata czy Ratpacka) czy ustawienie jakiegoś delaya w kodzie klas? Tzn np w kontrolerach?

I dalej pytanie pierwsze, jeżeli bym chciał wygenerować Tokena na podstawie username i password, to i tak musiałbym wysłać RequestBody z username + password. W sumie myślałem, żeby użyć metody Get i po prostu z RequestBody to podać, ale jak teraz myślę sobie łatwiej (i poprawnie) byłoby użyć metody Post i wygenerować Tokena, którym użytkownik by się posługiwał. Dobrze kombinuję?

Który ze sposobów jest częściej spotykany na produkcji? Tworzenie stanowych sesji w bezstanowej Restowej architekturze (czyli po trochu odejście od Resta) czy Tokeny? Sesja ma rację bytu, tak jak w materiale wykładowca mówił, tylko w przypadku gdy będą one lekkie, ale ciężko przewidzieć czy sesje rzeczywiście będą lekkie.

jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
0

Cóż to za ciekawy przypadek użycia: Jak dać użytkownikowi możliwość sprawdzenia, czy dane (jego nazwa użytkownika i hasło) są poprawne? Jaki to ma sens?


Przeważnie ignoruję niezarejestrowanych użytkowników.
AI
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 3 lata
  • Postów:375
0

Teraz zdałem sobie sprawę, po obejrzeniu tego co polecił AnyKtokolwiek, że mój sposób był błędny, bo zakładałem że wraz z każdym uderzeniem pod endpoint, prosiłbym a podanie Loginu i hasła. Wtedy, rzeczywiście musiałbym pozwolić sprawdzić użytkownikowi czy istnieje użytkownik o podanym loginie i haśle (lepiej, żeby użytkownik mógł sprawdzić czy użytkownik podał poprawny login i hasło niż żeby wyszło to przy np dodawaniu oferty), a po stronie klienta wymuszałoby to wysyłanie za każdym razem tych wartości.
Głupi pomysł. Teraz, wydaje mi się że lepiej byłoby zrobić endpoint (login czy jakoś tak) pod który użytkownik by wysyłał login i hasło i w zależności od tego, czy są poprawne zostanie wygenerowany token, którego będę używał do uwierzytelniania (np wyszukiwania Usera któremu odpowiada dany token).

AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:7 dni
  • Postów:3561
0
Aisekai napisał(a):

Teraz zdałem sobie sprawę, po obejrzeniu tego co polecił AnyKtokolwiek, że mój sposób był błędny, bo zakładałem że wraz z każdym uderzeniem pod endpoint, prosiłbym a podanie Loginu i hasła. Wtedy, rzeczywiście musiałbym pozwolić sprawdzić użytkownikowi czy istnieje użytkownik o podanym loginie i haśle (lepiej, żeby użytkownik mógł sprawdzić czy użytkownik podał poprawny login i hasło niż żeby wyszło to przy np dodawaniu oferty), a po stronie klienta wymuszałoby to wysyłanie za każdym razem tych wartości.
Głupi pomysł. Teraz, wydaje mi się że lepiej byłoby zrobić endpoint (login czy jakoś tak) pod który użytkownik by wysyłał login i hasło i w zależności od tego, czy są poprawne zostanie wygenerowany token, którego będę używał do uwierzytelniania (np wyszukiwania Usera któremu odpowiada dany token).

wiem, że mikrousługi są modne. Bazą do Twojej decyzji jest odpowiedź, czy to jest monolit - choćby monolit udostępniający liczne endpointy REST - czy rozproszenie. W monolicie masz dobrą starą sesję, w rozproszonym nie ma lepszego (chyba) jak JWT. Faktem jest, że w ślicznym modelu bezstanowego REST autentykacja jest jak wrzód ze stanem, ale takie jest życie.


Bo C to najlepszy język, każdy uczeń ci to powie
jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
0

@Aisekai, używasz słowa użytkownik do określenia 2 różnych rzeczy. Zrozumienie tego wymaga dużej empatii :)

Klient nie powinien dostawać hasła użytkownika. Hasło użytkownika powinno lecieć prosto do serwisu autoryzacyjnego. Klient może to zrobić przy użyciu Oauth2. Dobrze to jest opisane w introduction w oauth2 rfc: RFC 6749 Introduction. To jest generalna zasada, w Twoim przypadku może rzeczywiście da się to uprościć. Z drugiej strony powszechność obsługi Oauth2 jest tak duża, że może nie warto samemu projektować koła.

Fajną rzeczą jest keycloak, który bierze na siebie całą odpowiedzialność za authentication i authorization. Taka biblioteka do udostępniania uprawnień i zarządzania nimi. Można w niej robić bazę użytkowników, multum możliwości. Instalacja jest banalna - odzipować i odpalić bata.


Przeważnie ignoruję niezarejestrowanych użytkowników.
edytowany 1x, ostatnio: jarekczek
AI
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 3 lata
  • Postów:375
0

Masz rację, jarekczek, rzeczywiście postaram się o bardziej konkretnie pisać o co mi chodzi, w chwili gdy używam słów wieloznacznych. Mówiąc o kliencie miałem na myśli aplikację będącą interfejsem użytkownika. Z użytkownikiem, chodziło mi o to, że użytkownik (osoba) przez swój interfejs graficzny (klienta) najpierw by sprawdzał czy username i password (pola klasy User) są poprawne, żeby miał pewność że są, ale i tak uderzając pod jakieś endpointy i tak wymagał znów podania username i password jako RequestBody (na podstawie tego, by został wyszukany odpowiedni obiekt klasy User w bazie danych i np dodana do niego oferta). Potem dowiedziałem się o tokenie i rzeczywiście zrodził mi się pomysł, żeby go wykorzystać na zasadzie oddzielnego serwisu. Hasło nigdzie nie wypływa ze strony serwera, dto są pozbawione tego pola, a w bazie danych przechowuję hashowane za pomocą BCrypt (na potrzeby projektu wystarcza)

O ile dobrze zrozumiałem czym są monolity i różnicę między nimi a mikroserwisami, to raczej skupiam się na monolicie ze względu na to, że jest to projekt do portfolio i w przyszłości aplikacja (czy też system) nie będzie rozwijany, na tyle by wymagał przejścia na mikroserwisy. Chyba skłonię się ku utworzeniu sesji choćby ze względu bezpieczeństwa.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)