Zalogowany użytkownik jest pokazywany jako niezalogowany

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

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.

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.

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

@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.

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.

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.

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?

3

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...

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.

@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);
}
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.

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.

0

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

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