Zalogowany użytkownik jest pokazywany jako niezalogowany

Zalogowany użytkownik jest pokazywany jako niezalogowany
LukaszCh233
  • Rejestracja:prawie 2 lata
  • Ostatnio:około 16 godzin
  • Postów:180
0

Hej mam już dość sporo napisane i chce od was dostać jakieś rady. Co robie źle, co poprawić i ogólnie każda uwaga się przyda.
Wszystko działa prócz metody z logowaniem a raczej z wyświetlaniem danych zalogowanego customera czy też możliwość aktualizacji danych. Pokazuje mi, że taki użytkownik nie jest zalogowany mimo, że istnieje w bazie. Domyślam się, że mój sposób jest zły. Z góry dzięki za wszystkie rady.

https://github.com/LukaszCh233/Books_store

edytowany 1x, ostatnio: Riddle
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:3 miesiące
  • Postów:2787
0

A jakieś konkretne logi błędu? Wklej tutaj też konfigurację Spring Security, nie każdemu chce się szukać w repo xd I domyślam się, że wystawiasz jakiegoś RESTa, więc pokaż też kod kontrolera.

A z głowy, na czuja, to zgaduję że dany endpoint w ogóle nie jest chroniony przez Spring Security, przez co Security context go nie widzi.

OL
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:28
2

Problem w tym, że kolega nie korzysta w ogóle ze Spring Security tylko próbuje stworzyć coś swojego więc ja bym zaczął od przejrzenia czym jest Spring Security, a później spróbował to zaimplementować do projektu, pozbywając się jednocześnie swoich mechanizmów.

LukaszCh233
  • Rejestracja:prawie 2 lata
  • Ostatnio:około 16 godzin
  • Postów:180
0
Pinek napisał(a):

A jakieś konkretne logi błędu? Wklej tutaj też konfigurację Spring Security, nie każdemu chce się szukać w repo xd I domyślam się, że wystawiasz jakiegoś RESTa, więc pokaż też kod kontrolera.

A z głowy, na czuja, to zgaduję że dany endpoint w ogóle nie jest chroniony przez Spring Security, przez co Security context go nie widzi.

Zgadłeś nie używam Spring Seciurity

Kopiuj
@PostMapping("/customer")
public ResponseEntity<Customer> registerCustomer(@RequestBody Customer customer) {
    if (customer.getCustomerLogin() == null) {
        return ResponseEntity.badRequest().body(null);
    }
    if (customerLoginRepository.existsByEmail(customer.getCustomerLogin().getEmail())) {
        return ResponseEntity.status(HttpStatus.CONFLICT).body(null);
    }
    Customer savedCustomer = customerRepository.save(customer);
    return ResponseEntity.status(HttpStatus.CREATED).body(savedCustomer);
}

@PostMapping("/customer/login")
public ResponseEntity<String> loginCustomer(@RequestBody CustomerLogin customerLogin) {
    CustomerLogin storedCustomerLogin = customerLoginRepository.findByEmailAndPassword(customerLogin.getEmail(), customerLogin.getPassword());
    if (storedCustomerLogin != null) {
        Customer customer = customerRepository.findByEmail(customerLogin.getEmail());
        if (customer != null) {

            return new ResponseEntity<>("Correct", HttpStatus.OK);
        } else {

            return new ResponseEntity<>("Account does not exist",HttpStatus.NOT_FOUND);
        }
    } else {

        return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
    }
}

@GetMapping("/loggedCustomer/{email}/{password}")
public Customer getDataLoggedCustomer(@PathVariable String email, @PathVariable String password) {
    if (customerLoginRepository.findByEmailAndPassword(email, password) != null) {
        log.info("Client with email {} is logged in.", email);

        return customerRepository.findByEmail(email);
    } else {
        log.warn("Client with email {} is not logged in.", email);

        return null;
    }
}

@PutMapping("/loggedCustomer/update")
public Customer updateDataLoggedCustomer(@RequestBody Customer customer) {
    if (customerLoginRepository.existsByEmailAndPassword(customer.getCustomerLogin().getEmail(), customer.getCustomerLogin().getPassword())) {
        customerRepository.findByEmail(customer.getCustomerLogin().getEmail());
        log.info("Client with email {} is logged in. Updating data...", customer.getCustomerLogin().getEmail());
        return customerRepository.save(customer);
    } else {
        log.warn("Client with email {} is not logged in. Data update failed.", customer.getCustomerLogin().getEmail());

        return null;
    }
}

No i mam komunikat Client with email {} is not logged in. Pewnie dlatego, że w taki sposób napisane logowanie jest błędne.

edytowany 1x, ostatnio: Riddle
LukaszCh233
  • Rejestracja:prawie 2 lata
  • Ostatnio:około 16 godzin
  • Postów:180
0
olfeusz napisał(a):

Problem w tym, że kolega nie korzysta w ogóle ze Spring Security tylko próbuje stworzyć coś swojego więc ja bym zaczął od przejrzenia czym jest Spring Security, a później spróbował to zaimplementować do projektu, pozbywając się jednocześnie swoich mechanizmów.

Dokładnie jest tak jak mówisz, coś sam napisałem ale pozostaje użyć Spring Security.

edytowany 1x, ostatnio: Riddle
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:3 miesiące
  • Postów:2787
0

Hmm ogólnie to Twoja metoda getDataLoggedCustomer to tak naprawdę nie sprawdza zalogowanego użytkownika, ale po prostu wyszukuje użytkownika na podstawie podanych przez Ciebie parametrów (swoją drogą, podawanie password w urlu... xd), więc to jest zwykły search albo filter.

LukaszCh233
  • Rejestracja:prawie 2 lata
  • Ostatnio:około 16 godzin
  • Postów:180
0

Tak czułem, że to zły pomysł. Nie sprawdza zalogowanego użytkownika bo nie mam chyba takiej metody która loguje w sensie teoretycznie mam ale jest ona zła. Czyli pozostaje tylko użyć Spring Security?

RequiredNickname
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 11 godzin
  • Postów:614
4

Poczytaj o czymś takim jak sesja, jwt, spring security czy authentication providery i nie pisz tego sam bo jedyne co osiągniesz to utrwalisz sobie złe nawyki...

LukaszCh233
  • Rejestracja:prawie 2 lata
  • Ostatnio:około 16 godzin
  • Postów:180
0

Nie no nie mogę tego ogarnąć jakoś o ile rejestracja wygląda chyba git tak z logowaniem jest problem. Sama konfiguracja tego jest jakaś pokręcona.

Kopiuj
@PostMapping("/customer")
public ResponseEntity<String> registerCustomer(@RequestBody Customer customer) {
    if (customer.getCustomerLogin() == null) {
        return new ResponseEntity<>("Bad request", HttpStatus.BAD_REQUEST);
    }
    if (customerLoginRepository.existsByEmail(customer.getCustomerLogin().getEmail())) {
        return new ResponseEntity<>("this email already exists ",HttpStatus.CONFLICT);
    }
    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    String hashedPassword = passwordEncoder.encode(customer.getCustomerLogin().getPassword());
    customer.getCustomerLogin().setPassword(hashedPassword);

    customerRepository.save(customer);

    return new ResponseEntity<>("Correct register",HttpStatus.CREATED);
}
edytowany 1x, ostatnio: Riddle
RequiredNickname
co za zwięzłość. Na co komu architektura warstwowa jak można wszystko upchnąć w kontrolerze xD
LukaszCh233
Jak wszystko co w nim jest za dużo? :/
RequiredNickname
W tym kontolerze powinna być imho jedynie walidacja wejściowego dto a całą reszta (tak zwana logika) "powinna" być niżej. Poczytaj sobie o architekturze warstwowej, portach i adapterach (aka architktura hexagonalna) i ewentualnie innych stylach.
BB
  • Rejestracja:ponad 2 lata
  • Ostatnio:20 dni
  • Postów:66
0

A nie możesz użyć Spring Security i np. UserDetailsService. Jest już nawet domyślny panel logowania.
I jeśli zrobiłeś jakiś services to czego go nie używasz w tylko wszędzie w controlerach repository.

edytowany 2x, ostatnio: bbzzyyczczeek
LukaszCh233
Oj bo nie wiem już po co są te service jak przeglądam projekty ludzi to każdy to inaczej robi jeden bierze z repository drugi z service. Czyli taka metoda logowania nie będzie się znajdować w controller tylko po prostu w klasie w której konfiguruje to?
OL
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:28
0

W controlerze powinieneś wołać serwis, a serwis po dane powinien wołać do repistory i ewentualnie jako kolejną warstwę repository mogłoby wołać dao, które woła bazę. Czyli masz klasę, która rozszera JpaRepository i to jest np UserDao i ona zwraca bezpośrednio encje lub robi inne operacje na bazie. Później w repository wołasz to dao, np. kiedy chcesz pobrać dane klienta lub zedytować, ale nie zwracasz bezpośrednio encji, ale mapujesz ją na obiekt domenowy (tworzysz nową klasę na podstawie encji, ale przekazujesz tylko dane, które potrzebujesz). Tak obrobione dane przekazujesz do serwisu, który zawiera logikę. W Twoim wypadku będzie to sprawdzenie czy dane do logowania zgadzają się z tym co masz w bazie i później zwracasz wynik do controlera, który zwraca wynik na front.

BB
  • Rejestracja:ponad 2 lata
  • Ostatnio:20 dni
  • Postów:66
0

A rejestracja jest gdzieś. Jeśli nie to masz jakieś dane testowe?

LukaszCh233
Nie bardzo wiem o co pytasz dokładnie.
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)