In this section, we will delve into configuring Spring Security for your Spring Boot application. Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.
Key Concepts
- Security Configuration Class: A class annotated with @EnableWebSecuritythat extendsWebSecurityConfigurerAdapter.
- HttpSecurity: Configures security for HTTP requests.
- AuthenticationManagerBuilder: Configures authentication mechanisms.
- UserDetailsService: A core interface that loads user-specific data.
- PasswordEncoder: Encodes passwords for secure storage.
Step-by-Step Guide
- Adding Spring Security Dependency
First, add the Spring Security dependency to your pom.xml file:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
- Creating a Security Configuration Class
Create a class named SecurityConfig and annotate it with @EnableWebSecurity. This class will extend WebSecurityConfigurerAdapter to provide custom security configurations.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
            .and()
            .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
    }
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
- Explanation of the Code
- 
HttpSecurity Configuration: - authorizeRequests(): Specifies URL authorization rules.
- antMatchers("/", "/home").permitAll(): Allows unrestricted access to the root and home URLs.
- anyRequest().authenticated(): Requires authentication for any other request.
- formLogin(): Configures form-based login.
- loginPage("/login"): Specifies a custom login page.
- logout(): Configures logout functionality.
 
- 
AuthenticationManagerBuilder Configuration: - inMemoryAuthentication(): Configures in-memory authentication with two users:- userand- admin.
- passwordEncoder(): Defines a- PasswordEncoderbean using- BCryptPasswordEncoder.
 
- Creating a Custom Login Page
Create a simple login page (login.html) in the src/main/resources/templates directory:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form th:action="@{/login}" method="post">
        <div>
            <label>Username:</label>
            <input type="text" name="username"/>
        </div>
        <div>
            <label>Password:</label>
            <input type="password" name="password"/>
        </div>
        <div>
            <button type="submit">Login</button>
        </div>
    </form>
</body>
</html>
- Running the Application
Run your Spring Boot application. You should be able to access the root URL without authentication, but any other URL will redirect you to the custom login page.
Practical Exercise
Exercise: Customizing User Roles and Permissions
- Objective: Customize the security configuration to add a new role MANAGERand restrict access to a specific URL/adminto users with theADMINrole only.
- Steps:
- Modify the SecurityConfigclass to add a new user with theMANAGERrole.
- Update the HttpSecurityconfiguration to restrict access to/adminto users with theADMINrole.
 
- Modify the 
Solution
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .antMatchers("/admin").hasRole("ADMIN")
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication()
        .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
        .and()
        .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN")
        .and()
        .withUser("manager").password(passwordEncoder().encode("manager")).roles("MANAGER");
}Common Mistakes and Tips
- Common Mistake: Forgetting to encode passwords. Always use a PasswordEncoderto encode passwords.
- Tip: Use BCryptPasswordEncoderfor strong password hashing.
- Common Mistake: Misconfiguring URL patterns. Ensure URL patterns in antMatchersare correctly specified.
- Tip: Use hasRoleandhasAuthoritymethods to fine-tune access control.
Conclusion
In this section, you learned how to configure Spring Security in a Spring Boot application. You created a security configuration class, defined user roles, and set up a custom login page. You also practiced customizing user roles and permissions. In the next section, we will explore user authentication and authorization in more detail.
Spring Boot Course
Module 1: Introduction to Spring Boot
- What is Spring Boot?
- Setting Up Your Development Environment
- Creating Your First Spring Boot Application
- Understanding Spring Boot Project Structure
Module 2: Spring Boot Basics
- Spring Boot Annotations
- Dependency Injection in Spring Boot
- Spring Boot Configuration
- Spring Boot Properties
Module 3: Building RESTful Web Services
- Introduction to RESTful Web Services
- Creating REST Controllers
- Handling HTTP Methods
- Exception Handling in REST
Module 4: Data Access with Spring Boot
- Introduction to Spring Data JPA
- Configuring Data Sources
- Creating JPA Entities
- Using Spring Data Repositories
- Query Methods in Spring Data JPA
Module 5: Spring Boot Security
- Introduction to Spring Security
- Configuring Spring Security
- User Authentication and Authorization
- Implementing JWT Authentication
Module 6: Testing in Spring Boot
Module 7: Advanced Spring Boot Features
Module 8: Deploying Spring Boot Applications
Module 9: Performance and Monitoring
- Performance Tuning
- Monitoring with Spring Boot Actuator
- Using Prometheus and Grafana
- Logging and Log Management
