Basic Authentication is a simple and stateless authentication mechanism built into the HTTP protocol. It’s easy to implement and useful for:
- Securing internal APIs
- Prototyping or quick services
- Environments where TLS/SSL is enforced (important for securing credentials)
Lets learn how Securing REST APIs with Basic Authentication in Spring Boot can be done.

๐ฆ Project Setup
Maven Dependencies
In your pom.xml
, include:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> |
๐งฉ Project Structure
1 2 3 4 5 6 7 8 9 10 11 12 13 |
src/ โโโ main/ โโโ java/ โโโ com/ โโโ kscodes/ โโโ springboot/ โโโ security/ โโโ SecurityConfig.java โโโ ApiController.java โโโ SpringBootSecurityApplication.java |
๐ Step 1: Create SecurityConfig
for Basic Authentication
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
package com.kscodes.springboot.security; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; @Configuration public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeHttpRequests(auth -> auth .requestMatchers("/api/public").permitAll() .anyRequest().authenticated() ) .httpBasic(); // Enable Basic Authentication return http.build(); } @Bean public UserDetailsService users() { return new InMemoryUserDetailsManager( User.withUsername("user") .password(passwordEncoder().encode("password")) .roles("USER") .build(), User.withUsername("admin") .password(passwordEncoder().encode("adminpass")) .roles("ADMIN") .build() ); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } |
๐ Step 2: Create a REST Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com.kscodes.springboot.security; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ApiController { @GetMapping("/api/public") public String publicApi() { return "This is a public endpoint."; } @GetMapping("/api/user") public String userApi() { return "Welcome, authenticated USER."; } @GetMapping("/api/admin") public String adminApi() { return "Welcome, authenticated ADMIN."; } } |
๐ Step 3: Main Spring Boot Application
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.kscodes.springboot.security; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringBootSecurityApplication { public static void main(String[] args) { SpringApplication.run(SpringBootSecurityApplication.class, args); } } |
๐งช Testing the Endpoints
1. Accessing the public endpoint
1 2 3 |
curl http://localhost:8080/api/public |
๐ข Output: "This is a public endpoint."
2. Accessing a protected endpoint without credentials
1 2 3 |
curl http://localhost:8080/api/user |
๐ด Output: HTTP/1.1 401 Unauthorized
3. Accessing with Basic Auth
1 2 3 |
curl -u user:password http://localhost:8080/api/user |
๐ข Output: "Welcome, authenticated USER."
1 2 3 4 |
curl -u admin:adminpass http://localhost:8080/api/admin |
๐ข Output: "Welcome, authenticated ADMIN."
โ ๏ธ Important Notes
- Always use HTTPS with Basic Auth to avoid sending credentials in clear text.
- Avoid Basic Auth in production unless used with secure environments or in internal microservices behind a gateway.
- Prefer OAuth2/JWT for public APIs.
๐ Best Practices
- Use
BCryptPasswordEncoder
for encoding passwords. - Separate roles clearly in
SecurityConfig
. - Add rate-limiting and logging for security-sensitive endpoints.
- Keep credentials in secure secrets manager, not in plain code or config.
๐ References
๐ Conclusion
Securing REST APIs with Basic Authentication in Spring Boot is straightforward using Spring Security. With the new Spring Boot 3 and Spring Security 6, configuration is more streamlined using Java configuration with SecurityFilterChain
.
Use this setup for quick authentication and secure your internal APIs effectively using Spring’s robust security model.