Skip to main content

Command Palette

Search for a command to run...

How to Set Up Spring Security in Spring Boot 3.x

Updated
4 min read

1️⃣ Introduction

Security is a critical aspect of modern applications, ensuring that only authorized users can access protected resources. With the latest updates in Spring Boot 3.x, Spring Security has introduced a more streamlined, flexible configuration using SecurityFilterChain and the new Lambda-based approach.

In this guide, we will explore how Spring Security works in Spring Boot 3.x, covering auto-configuration, customization, and hands-on authentication setup. Whether you're new to Spring Security or upgrading from an earlier version, this blog will provide a step-by-step breakdown. 🚀


2️⃣ Spring Security Auto-Configuration & Customization

Spring Boot automatically configures Spring Security when you include the spring-boot-starter-security dependency. By default, it:

  • Enables basic authentication with a generated password.

  • Protects all endpoints by default.

  • Provides a default user (user) and an auto-generated password.

Default Behavior: When you run a Spring Boot application with Spring Security, it will prompt you for credentials before accessing any endpoint.

📌 Spring Security Auto-Configuration: A feature in Spring Boot that automatically sets up default security settings, requiring authentication for all endpoints.


3️⃣ Understanding SecurityFilterChain

In Spring Security 5 and 6, the old WebSecurityConfigurerAdapter class has been deprecated, and developers now use SecurityFilterChain.

🔹 What is SecurityFilterChain?

SecurityFilterChain is a bean that defines security rules for handling authentication and authorization in Spring Security.

Key Responsibilities:

  • Defines which endpoints require authentication.

  • Configures how users authenticate (e.g., in-memory, database, OAuth2).

  • Specifies custom security rules.

📌 SecurityFilterChain: A configurable security bean in Spring Security that controls authentication, authorization, and security filters.


4️⃣ Configuring In-Memory Users & Roles

If you don’t have a database yet, you can use in-memory authentication to define users and roles directly in the security configuration.

🔹 Example: Creating Users with Different Roles

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/admin/**").hasRole("ADMIN")
            .requestMatchers("/user/**").hasRole("USER")
            .anyRequest().authenticated()
        )
        .formLogin(withDefaults());
    return http.build();
}

@Bean
public UserDetailsService userDetailsService() {
    UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();

    UserDetails admin = User.withDefaultPasswordEncoder()
            .username("admin")
            .password("password")
            .roles("ADMIN")
            .build();

    return new InMemoryUserDetailsManager(user, admin);
}

📌 In-Memory Authentication: A method where users and roles are stored in memory instead of a database.

📌 UserDetailsService: An interface in Spring Security that retrieves user authentication data.


5️⃣ Spring Security’s New Lambda-Based Approach (HttpSecurity API)

Spring Security 6 introduces a Lambda-based configuration for HttpSecurity, making it more readable and flexible.

🔹 Old Way (WebSecurityConfigurerAdapter - Deprecated)

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/user/**").hasRole("USER")
        .anyRequest().authenticated()
        .and()
        .formLogin();
}

🔹 New Way (Lambda-Based Approach)

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/admin/**").hasRole("ADMIN")
            .requestMatchers("/user/**").hasRole("USER")
            .anyRequest().authenticated()
        )
        .formLogin(Customizer.withDefaults());
    return http.build();
}

📌 HttpSecurity API: A security configuration class in Spring Security used to define authentication and authorization rules.

📌 Lambda-Based Approach: A new way of writing Spring Security configurations in a more readable, functional style.


6️⃣ How to Disable Default Security Settings?

Sometimes, you might need to disable default security settings for testing purposes or custom implementations.

🔹 Example: Disabling Security Completely

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.csrf().disable()
        .authorizeHttpRequests(auth -> auth.anyRequest().permitAll());
    return http.build();
}

📌 Disabling CSRF (Cross-Site Request Forgery): Useful when working with APIs without a browser-based client.

📌 Permit All Requests: Allows access to all endpoints without authentication.


7️⃣ ✅ Hands-on: Customizing Authentication with SecurityFilterChain

🔹 Step 1: Add Spring Security Dependency

Add the following dependency to your pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

🔹 Step 2: Create a Security Configuration Class

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .requestMatchers("/user/**").hasRole("USER")
                .anyRequest().authenticated()
            )
            .formLogin(Customizer.withDefaults());
        return http.build();
    }
}

🔹 Step 3: Define Users in Memory

@Bean
public UserDetailsService userDetailsService() {
    UserDetails user = User.withUsername("user")
            .password("password")
            .roles("USER")
            .build();
    return new InMemoryUserDetailsManager(user);
}

🔹 Step 4: Run the Application & Test

  • Start the application.

  • Open http://localhost:8080.

  • Log in with user/password.

  • Access different endpoints based on roles.


8️⃣ Call to Action

Want to learn more about Spring Security? Follow me on Bits8Byte for more hands-on tutorials! 🚀 If you found this helpful, share it with others! 🔥


Spring Security

Part 3 of 4

A comprehensive guide to understanding and implementing security in Spring Boot applications using the latest version of Spring Security. Covering authentication, authorization, JWT, OAuth2, and advanced security concepts.

Up next

Understanding Spring Security: Why It Matters

1️⃣ Introduction In today's digital world, securing applications is more important than ever. With increasing cyber threats, protecting sensitive data and ensuring that only authorized users access certain parts of an application is critical. This is...

More from this blog

B

Bits8Byte

42 posts

I explore the latest AI developments through an engineering lens, along with the mindset shifts needed to adapt, build, and stay ahead.