PS #3: rejestracja użytkowników

rejestracja użytkowników

Ostatnio dodaliśmy do naszego sklepu możliwość logowania, jednak dane użytkowników są pobierane z pamięci aplikacji. Dzisiaj wprowadzimy kolejną funkcję, a będzie nią rejestracja użytkowników 🙂 Będziemy zapisywać zarejestrowanego użytkownika w lokalnej bazie danych, a następnie przy logowaniu aplikacja będzie pobierać użytkowników właśnie z tej bazy.

Tworzenie klasy użytkownika

Aby odwoływać się do użytkownika musimy najpierw zdefiniować go w naszej aplikacji. W tym celu tworzymy klasę pl.mocode.model.User, która implementuje interfejs UserDetails (w ten sposób będzie wiadomo, w jaki sposób aplikacja ma interpretować naszego użytkownika przy logowaniu). Na razie zadeklarujemy tylko podstawowe pola w klasie.

public enum Role {
    USER, ADMIN
}

@Id
private String id;
private String email;
private String name;
private String surname;
private String password;
private Role role = Role.USER;

public User() {
}

public User(String email, String name, String surname, String password) {
    this.email = email;
    this.name = name;
    this.surname = surname;
    this.password = password;
}

Będziemy potrzebować również repozytorium użytkowników. W tym celu stwórzmy klasę pl.mocode.dao.UserDao. W razie wątpliwości odsyłam do artykułu na temat mongoDB, w którym omawiałem analogiczny przypadek 😉

Rejestracja użytkowników

Aby zarejestrować użytkownika musimy pobrać z wysłanego formularza rejestracji dane, a następnie zapisać je w bazie danych. Przyjrzyjmy się klasie MainController:

@RequestMapping("/register")
public String getRegisterPage() {
    return "register";
}

@RequestMapping(value = "/register", method = RequestMethod.POST)
public String registerUser(@ModelAttribute User user) {
    if (userDao.findAll().isEmpty()) {
        user.setRole(User.Role.ADMIN);
    }

    userDao.save(user);
    return "redirect:/users";
}

Funkcja getRegisterPage() zwraca nam stronę z formularzem rejestracji, natomiast funkcja registerUser() – uruchomiana w przypadku zapytania /register przesłanego metodą POST – przy pomocy adnotacji @ModelAttribute odbiera dane z formularza (parametry name znaczników input muszą być takie same jak nazwy pól klasy, w tym przypadku User) i przypisuje je do danych pól klasy User. Wyrażenie warunkowe sprawdza czy lista zarejestrowanych użytkowników jest pusta i jeżeli warunek jest spełniony to zmienia rolę rejestrowanego użytkownika na ADMIN (innymi słowy – pierwszy rejestrowany użytkownik będzie miał rolę ADMIN). Następnie zapisujemy użytkownika w bazie i zwracamy listę użytkowników.

Logowanie

Musimy teraz dokonać zmian w systemie logowania, aby użytkownicy byli sprawdzani z bazy danych, a nie jak do tej pory z pamięci aplikacji. Przejdźmy do klasy SecurityConfig:

@Autowired
protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userService);
}

Uwierzytelniamy użytkowników z pomocą naszego autorskiego UserService implementującego interfejs UserDetailsService, ale aby wstrzyknąć go do klasy konfiguracyjnej, musimy zmienić jej adnotację na @Configurable.

Thymeleaf

Na stronie głównej, dostępnej po zalogowaniu, wyświetlamy nazwę zalogowanego użytkownika (w naszym przypadku email) oraz jego rolę na stronie. W tym celu korzystamy z tagu sec, który importujemy w znaczniku html

xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"

Dodatkowo musimy dodać zależność w pliku build.gradle pozwalającą skorzystać z tych funkcji:

compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity4")

Pamiętaj, aby odświeżyć gradle’a po dokonaniu zmian 😉

Podsumowanie

Dzisiaj dodaliśmy możliwość rejestracji użytkowników poprzez zapisywanie ich w lokalnej bazie danych, wprowadziliśmy wstępną obsługę ról na stronie, oraz zmodyfikowaliśmy system logowania tak, aby pobierał on dane użytkowników z bazy. Tym samym zakończyliśmy prace nad systemem rejestracji i logowania do naszej aplikacji 🙂 Dzięki i do zobaczenia w następnych wpisach!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *