inchirags@gmail.com Chirag Spring Boot Tutorial https://www.chirags.in
Spring Boot Login, Register, Logout with MySQL & Thymeleaf | Bootstrap UI | Show User Details
Here’s a step-by-step beginner’s guide to build a Login, Register, and Logout system using Spring Boot + Thymeleaf + MySQL, styled with Bootstrap and FontAwesome.
Project Overview Project Name: loginauth Tech Stack: Spring Boot, Spring Security, Thymeleaf, MySQL IDE: IntelliJ IDEA Goal: After login, redirect to a Home page and display name and email Database password: admin@123
Step-by-Step Instructions
1: Set Up the Project in IntelliJ IDEA
Open:
https://start.spring.io/
Configure the project:
- Project: Maven - Language: Java - Spring Boot Version: Use the latest stable version (e.g., 3.3.x or latest available). - Group: com.example - Artifact: loginauth - Name: loginauth - Package Name: com.example.loginauth - Java Version: 17 or 21 (ensure compatibility with your JDK). - Packaging: Jar
Add the following dependencies:
- Spring Web - Spring Data JPA - MySQL Driver - Thymeleaf - Spring Security
Click Create to generate the project.
It will give you the Zip file. Extract the zip file and open with IntelliJ IDEA.
- Configure application.properties
src/main/resources/application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/loginauth?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=admin@123 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.thymeleaf.cache=false
- Create Database
Open MySQL and create the database:
CREATE DATABASE loginauth;
- Create Entity - User
// com.example.loginauth.model.User.java
package com.example.loginauth.model; import jakarta.persistence.*; @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; private String password; // Getters and setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
- Create Repository
// com.example.loginauth.repository.UserRepository.java
package com.example.loginauth.repository; import com.example.loginauth.model.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { User findByEmail(String email); }
- Create User Service
// com.example.loginauth.service.UserService.java
package com.example.loginauth.service; import com.example.loginauth.model.User; import com.example.loginauth.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserRepository userRepository; private final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); public void save(User user) { user.setPassword(encoder.encode(user.getPassword())); userRepository.save(user); } public User findByEmail(String email) { return userRepository.findByEmail(email); } }
- Spring Security Configuration
// com.example.loginauth.config.SecurityConfig.java
package com.example.loginauth.config; import com.example.loginauth.service.UserService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.core.userdetails.*; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration public class SecurityConfig { @Bean public UserDetailsService userDetailsService(UserService userService) { return email -> { var user = userService.findByEmail(email); if (user == null) throw new UsernameNotFoundException("User not found"); return User.builder() .username(user.getEmail()) .password(user.getPassword()) .roles("USER") .build(); }; } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeHttpRequests(auth -> auth .requestMatchers("/register", "/css/**", "/js/**").permitAll() .anyRequest().authenticated()) .formLogin(form -> form .loginPage("/login").permitAll() .defaultSuccessUrl("/home", true)) .logout(logout -> logout.permitAll()); return http.build(); } @Bean public BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
- Create Controller
// com.example.loginauth.controller.AuthController.java
package com.example.loginauth.controller; import com.example.loginauth.model.User; import com.example.loginauth.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @Controller public class AuthController { @Autowired private UserService userService; @GetMapping("/login") public String loginPage() { return "login"; } @GetMapping("/register") public String registerForm(Model model) { model.addAttribute("user", new User()); return "register"; } @PostMapping("/register") public String registerUser(@ModelAttribute User user) { userService.save(user); return "redirect:/login"; } @GetMapping("/home") public String homePage(@AuthenticationPrincipal UserDetails userDetails, Model model) { User user = userService.findByEmail(userDetails.getUsername()); model.addAttribute("name", user.getName()); model.addAttribute("email", user.getEmail()); return "home"; } }
- Thymeleaf Templates
📄 login.html
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Login</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> </head> <body class="container mt-5"> <h2><i class="fa fa-sign-in-alt"></i> Login</h2> <form method="post" th:action="@{/login}"> <div class="mb-3"> <label>Email:</label> <input type="text" name="username" class="form-control"/> </div> <div class="mb-3"> <label>Password:</label> <input type="password" name="password" class="form-control"/> </div> <button type="submit" class="btn btn-primary">Login</button> <a th:href="@{/register}" class="btn btn-link">Register</a> </form> </body> </html>
📄 register.html
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Register</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> </head> <body class="container mt-5"> <h2><i class="fa fa-user-plus"></i> Register</h2> <form th:action="@{/register}" th:object="${user}" method="post"> <div class="mb-3"> <label>Name:</label> <input type="text" th:field="*{name}" class="form-control"/> </div> <div class="mb-3"> <label>Email:</label> <input type="email" th:field="*{email}" class="form-control"/> </div> <div class="mb-3"> <label>Password:</label> <input type="password" th:field="*{password}" class="form-control"/> </div> <button type="submit" class="btn btn-success">Register</button> </form> </body> </html>
📄 home.html
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Home</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> </head> <body class="container mt-5"> <h2><i class="fa fa-home"></i> Welcome Home</h2> <p><strong>Name:</strong> <span th:text="${name}"></span></p> <p><strong>Email:</strong> <span th:text="${email}"></span></p> <form th:action="@{/logout}" method="post"> <button type="submit" class="btn btn-danger">Logout</button> </form> </body> </html>
- Run the Project
./mvnw spring-boot:run
Or
Fun the below java class :
LoginauthApplication
Visit:
http://localhost:8080/login
Register → Login → Home → Logout
For any doubts and query, please write on YouTube video 📽️ comments section.
Note : Flow the Process shown in video 📽️.
😉Subscribe and like for more videos:
https://www.youtube.com/@chiragstutorial
💛Don't forget to, 💘Follow, 💝Like, 💖Share 💙&, Comment
Thanks & Regards,
Chitt Ranjan Mahto "Chirag"
https://www.chirags.in
Note: All scripts used in this demo will be available in our website.
Link will be available in description.
Top comments (0)