Cześć!
Chciałbym się dowiedzieć czy jest możliwość utworzenia blokady optymistycznej w aplikacji bezstanowej. Tworzę aplikację opartą o Spring-boot oraz AngularJS, łącząc całość za pomocą RESTa, a jako mechanizm uwierzytelniania wykorzystuję Json Web Token.
Przechodząc do sedna problemu: chciałbym wczytać jakiś obiekt z bazy danych, udostępnić go do edycji na froncie, a następnie zapisać. Próbowałem to zrobić tak, aby przesyłać pole wersji (oznaczone w encji jako @Version) na front, razem z innymi danymi.Jest to jednak słabe rozwiązanie, gdyż wersja jest wtedy podatna na zmianę przez użytkownika.
Czy istnieje zatem jakaś możliwość, bez wykorzystywania komponentów stanowych, aby dokonać blokady optymistycznej?
- Rejestracja:ponad 8 lat
- Ostatnio:około 8 lat
- Postów:6
0

- Rejestracja:prawie 20 lat
- Ostatnio:około godziny
0
Nie znam się na Angularze ale odpowiem: wyłącz edycję dla pola z wersją ;]
edytowany 1x, ostatnio: Wibowit
piotrek380
Ja nie udostępniam tego pola do edycji przez użytkownika - chodzi tutaj bardziej o przechwycenie requestu i podmianę tego pola w JSON, który ma być odesłany do serwera. Jeśli ktoś przechwyci to zapytanie, bez problemu może zmienić to pole na jakąkolwiek inną wartość.

- Rejestracja:ponad 13 lat
- Ostatnio:prawie 3 lata

- Rejestracja:około 10 lat
- Ostatnio:ponad 6 lat
- Lokalizacja:Warszawa
- Postów:293
2
Rozwiązanie przedstawione w tym filmiku to jest to, o czym napisałem w pierwszym poście. Tak zaimplementowałem i działa, jednak promotor stwierdził, że nie jest to do końca bezpieczne rozwiązanie, bo ktoś może przechwycić wersję i ją zmienić ręcznie. Ale wielkie dzięki za filmik - jest bardzo ciekawy :)
w sumie to zazdroszczę @piotrek380 promotora. to mądry gość. przesyłanie Version na front to klasyczna dobra praktyka, ale fakt jak front jest client side warto się zabezpieczyć

- Rejestracja:około 10 lat
- Ostatnio:ponad 6 lat
- Lokalizacja:Warszawa
- Postów:293
1
No to może po prostu zamiast wysyłać wersji w czystej postaci, wysyłaj jej hasha, np. SHA256? I gdy wraca, sprawdź czy
hash(entity.version) equals requestObject.hashedVersion
(w odniesieniu do filmu powyżej)
edytowany 1x, ostatnio: Lectre
Sprawdzam właśnie rozwiązanie zaproponowane przez @vpiotr. Jeżeli nie zadziała, to wtedy właśnie zrobię hasha. Dzięki wielkie za pomoc. Dam znać jak mi się uda.
- Rejestracja:ponad 8 lat
- Ostatnio:około 8 lat
- Postów:6
0
Próbowałem zrobić to sposobem zaproponowanym przez @vpiotr, jednak nie udało mi się. Co prawda ETag był generowany przy zapytaniu GET, jednak nie potrafiłem obsłużyć tego przy próbie zapisu - nie mam pojęcia z czego był generowany ten hash.
Rozwiązałem to, tworząc hash MD5 pola wersji, który przesyłam jako ETag. Mam nadzieję, że to będzie wystarczającym rozwiązaniem.
Dzięki wszystkim za pomoc :)
ok, dzięki