This tutorial will walk you through the process of creating a Registration and Login Example with Spring MVC, Spring Security, Spring Data JPA, Hibernate, MySQL, JSP, and Bootstrap.
If you are new to Spring MVC or Spring Data JPA, it would be best to work your way through below before starting this example: - Spring MVC Hello World Example with XML Configuration, Maven and JSP - JPA Many-To-Many Relationship Mapping Example with Spring Boot, Maven, and MySQL
If you don't want to deal with XML Configurations, try: Registration and Login Example with Spring Boot, Spring Security, Spring Data JPA, Hibernate, HSQL, JSP and Bootstrap
What you'll build
Log in 
Log out 
Register account 
Welcome 
What you'll need
- JDK 8+ or OpenJDK 8+
- Maven 3+
- MySQL Server 5.6+
Project structure
├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── hellokoding
│       │           └── account
│       │               ├── model
│       │               │   ├── Role.java
│       │               │   └── User.java
│       │               ├── repository
│       │               │   ├── RoleRepository.java
│       │               │   └── UserRepository.java
│       │               ├── service
│       │               │   ├── SecurityServiceImpl.java
│       │               │   ├── SecurityService.java
│       │               │   ├── UserDetailsServiceImpl.java
│       │               │   ├── UserServiceImpl.java
│       │               │   └── UserService.java
│       │               ├── validator
│       │               │   └── UserValidator.java
│       │               └── web
│       │                   └── UserController.java
│       ├── resources
│       │   ├── application.properties
│       │   ├── db.sql
│       │   ├── logback.xml
│       │   └── validation.properties
│       └── webapp
│           ├── resources
│           │   ├── css
│           │   │   ├── bootstrap.min.css
│           │   │   └── common.css
│           │   └── js
│           │       └── bootstrap.min.js
│           └── WEB-INF
│               ├── views
│               │   ├── login.jsp
│               │   ├── registration.jsp
│               │   └── welcome.jsp
│               ├── appconfig-data.xml
│               ├── appconfig-mvc.xml
│               ├── appconfig-root.xml
│               ├── appconfig-security.xml
│               └── web.xml
└── pom.xml
Project dependencies
Database
Define JPA Entities
JPA Entity is defined with @Entity annotation, represent a table in your database.
@Table maps the entity with the table. If no @Table is defined, the default value is used: the class name of the entity.
@Id declares the identifier property of the entity.
@ManyToMany defines a many-to-many relationship between 2 entities. @JoinColumn indicates the entity is the owner of the relationship: the corresponding table has a column with a foreign key to the referenced table. mappedBy indicates the entity is the inverse of the relationship.
Spring Data JPA Repositories
Spring Data JPA contains some built-in Repository implemented common functions to work with a database such as findOne, findAll, and save
Implement Spring Security's UserDetailsService
To implement login/authentication with Spring Security, we need to implement org.springframework.security.core.userdetails.UserDetailsService interface
Authorization is implemented via XML file configuration appconfig-security.xml
Define Security Service
We create SecurityService to provide current logged in user and auto login user after registration
Define User Service
Provide service for registering account
Implement Spring Validator
To provide input-data validation for /registration controller with Spring Validator, we implement org.springframework.validation.Validator. Error codes, e.g. Size.userForm.username, are defined by validation.properties
Define Controllers
/login POST controller is provided by Spring Security
Define View Templates
Define Properties
XML Configurations
Web Config
Spring MVC Config
Spring Data JPA Config
Spring Security Config
Run with Maven and Jetty
You can run the application using mvn jetty:run and visit to http://localhost:8080
Source code
If you don't want to deal with XML Configurations, try: Registration and Login Example with Spring Boot, Spring Security, Spring Data JPA, Hibernate, HSQL, JSP and Bootstrap
