Skip to main content
Please wait...
Implementing a Spring Security Configuration
14 Apr, 2025

Implementing a Spring Security Configuration

Spring Security is a powerful framework for securing Java applications, providing authentication, authorization, and protection against common attacks like CSRF, XSS, and SQL injection, ensuring robust application security.

 

Web Security Features of Spring Security

  • Authentication: Verifies user identity using credentials like username and password. 

  • Authorization: Determines access levels based on user roles and permissions. 

  • Protection Against Common Threats: Includes CSRF (Cross-Site Request Forgery) protection, session fixation protection, and secure headers. 

  • URL-Based Security: Configures access rules for different URL patterns. 

  • Method-Level Security: Secures methods using annotations like @PreAuthorize and @Secured. 

  • Form-Based Login: Provides customizable login forms and handles login/logout processes. 

  • Password Encoding: Ensures passwords are stored securely using various encoding mechanisms. 

 

Spring Security Configuration Best Practices 

Below are some best practices for securing your Spring Security applications: 

  • Password Encoding: Use strong encoding mechanisms like BCrypt to securely store sensitive information. 

  • CORS Security: Restrict cross-origin requests by configuring specific allowed origins to prevent unauthorized access. 

  • JWT Implementation: Utilize Access Tokens and Refresh Tokens for secure and efficient user authentication. Store tokens securely in memory to reduce exposure to potential attacks. 

  • RSA Key Pair: Leverage Asymmetric Encryption with an RSA key pair for secure JWT token signatures, ensuring integrity and authenticity. 

  • Implement HTTPS: Ensure all communications are encrypted by using HTTPS 

  • Validate Inputs: Always validate and sanitize user inputs to prevent injection attacks 

  • Use Security Headers: Implement security headers like Content Security Policy (CSP), X-Content-Type-Options, and X-Frame-Options 

  • Session Management: Properly manage user sessions to prevent session fixation and hijacking 

  • Monitor and Audit: Regularly monitor and audit your application for security vulnerabilities and breaches. 

  • Keep Dependencies Updated: Regularly update your dependencies to patch known vulnerabilities 

 

Basic Authentication with Spring Security 

In a basic authentication use case with Spring Security, a user submits their credentials (username and password) via a login form. Spring Security intercepts this request, authenticates the credentials against a configured user store (like a database or in-memory user details). If authentication is successful, the user is granted access to protected resources. Otherwise, an error message is displayed. This process ensures that only authenticated users can access sensitive parts of the application, enhancing overall security and user management. 

 

Spring Security Configuration Use Case

  • Add Dependencies: Include Spring Security dependencies in your pom.xml for Maven or build.gradle for Gradle. 

 <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
  </dependency> 
 
  • Create Security Configuration Class: Extend WebSecurityConfigurerAdapter to customize security settings. 

 @Configuration 
  @EnableWebSecurity 
  public class SecurityConfig extends WebSecurityConfigurerAdapter { 
      @Override 
      protected void configure(HttpSecurity http) throws Exception { 
          http 
              .authorizeRequests() 
                  .antMatchers("/public/**").permitAll() 
                  .anyRequest().authenticated() 
                  .and() 
              .formLogin() 
                  .loginPage("/login") 
                  .permitAll() 
                  .and() 
              .logout() 
                  .permitAll(); 
      } 
      @Override 
      protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
          auth 
             inMemoryAuthentication() 
                  .withUser("user").password("{noop}password").roles("USER") 
                  .and() 
                  .withUser("admin").password("{noop}admin").roles("ADMIN"); 
      } 
  } 
  • Custom Login Page: Create a custom login page (login.html) and configure its endpoint in the security configuration. 

 <form action="/login" method="post"> 
      <div> 
          <label>Username:</label> 
          <input type="text" name="username"/> 
      <div> 
          <label>Password:</label> 
          <input type="password" name="password"/> 
      </div> 
      <div> 
          <button type="submit">Login</button> 
      </div> 
  </form> 
 
  • Security Context: Use SecurityContextHolder to access the security context in your application. 
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
String username = auth.getName(); 
  

Configuring Spring Security with the SecurityFilterChain Interface 

The SecurityFilterChain interface matches a filter chain against an HttpServletRequest to decide whether the chain applies to the request. You typically use it with HttpSecurity to define security rules. 
 

Example Leveraging SecurityFilterChain

Create Security Configuration Class: Use `SecurityFilterChain` to configure security settings.   

@Configuration
@EnableWebSecurity
public class SecurityConfig {
   @Bean
   public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
       http
           .authorizeRequests(authorizeRequests - >
               authorizeRequests
               .antMatchers("/public/**").permitAll()
               .anyRequest().authenticated()
           )
           .httpBasic(withDefaults()); // Enables basic authentication
       return http.build();
   }
}

 

Kotlin Example: 

Create Security Configuration Class: Use SecurityFilterChain to configure security settings. 

 @Configuration 
  class SecurityConfig { 
      @Bean 
      fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { 
          http 
              .authorizeRequests() 
                  .antMatchers("/public/**").permitAll() 
                  .anyRequest().authenticated() 
                  .and() 
              .formLogin() 
                  .loginPage("/login") 
                  .permitAll() 
                  .and() 
              .logout() 
                  .permitAll() 
          return http.build() 
      } 
      @Bean 
      fun userDetailsService(): InMemoryUserDetailsManager { 
          val user = User.withDefaultPasswordEncoder() 
              .username("user") 
              .password("password") 
              .roles("USER") 
              .build() 
         ("admin") 
              .password("admin") 
              .roles("ADMIN") 
              .build() 
          return InMemoryUserDetailsManager(user, admin) 
      } 
  } 

SecurityFilterChain: This bean configures the security settings using HttpSecurity. It sets up URL-based security, form-based login, and logout handling. 

InMemoryUserDetailsManager: This bean manages user details in memory, creating two users with different roles (USER and ADMIN).