Basic Authentication হলো একটি সাধারণ অথেনটিকেশন পদ্ধতি যেখানে ব্যবহারকারীর ক্রেডেনশিয়াল (ইউজারনেম এবং পাসওয়ার্ড) HTTP হেডারের মাধ্যমে পাঠানো হয়। Spring Security ডিফল্টভাবে Basic Authentication সমর্থন করে।
pom.xml
ফাইলে Spring Security এর ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Spring Security যোগ করার পর কোনো অতিরিক্ত কনফিগারেশন ছাড়াই Basic Authentication সক্রিয় হয়। ডিফল্ট কনফিগারেশন:
user
একটি এন্ডপয়েন্ট যোগ করুন:
@RestController
public class TestController {
@GetMapping("/secured")
public String securedEndpoint() {
return "This is a secured endpoint";
}
}
এখন ব্রাউজারে /secured
এন্ডপয়েন্ট অ্যাক্সেস করলে লগইন ডায়লগ দেখা যাবে।
ডিফল্ট কনফিগারেশন পরিবর্তন করতে হলে Spring Security কনফিগার করুন।
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Public endpoints
.anyRequest().authenticated() // Secured endpoints
.and()
.httpBasic(); // Enable Basic Authentication
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user")
.password(passwordEncoder().encode("password"))
.roles("USER")
.and()
.withUser("admin")
.password(passwordEncoder().encode("admin"))
.roles("ADMIN");
}
}
আপনার এন্ডপয়েন্ট অ্যাক্সেস করার জন্য HTTP ক্লায়েন্ট (যেমন Postman বা Curl) ব্যবহার করুন।
GET
।http://localhost:8080/secured
Basic Auth
user
password
curl -u user:password http://localhost:8080/secured
ইন-মেমরি অথেনটিকেশন পরিবর্তে ডাটাবেস থেকে ইউজার ডেটা লোড করার জন্য UserDetailsService
ব্যবহার করা হয়।
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// ডাটাবেস থেকে ইউজার ডেটা লোড করুন
if ("user".equals(username)) {
return User.builder()
.username("user")
.password(new BCryptPasswordEncoder().encode("password"))
.roles("USER")
.build();
} else if ("admin".equals(username)) {
return User.builder()
.username("admin")
.password(new BCryptPasswordEncoder().encode("admin"))
.roles("ADMIN")
.build();
}
throw new UsernameNotFoundException("User not found");
}
}
@Bean
public void configureGlobal(AuthenticationManagerBuilder auth, CustomUserDetailsService userDetailsService) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
BCryptPasswordEncoder
ব্যবহার করুন।Limited Endpoint Access: রোল বা পারমিশন অনুযায়ী এন্ডপয়েন্ট অ্যাক্সেস সীমাবদ্ধ করুন:
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated();
Spring Security এর Basic Authentication হলো অ্যাপ্লিকেশনের অথেনটিকেশন পরিচালনার একটি সহজ এবং কার্যকর পদ্ধতি। এটি ডিফল্টভাবে অন্তর্ভুক্ত থাকে এবং খুব দ্রুত সেটআপ করা যায়। তবে HTTPS এর মতো সিকিউরিটি চ্যানেল নিশ্চিত করা গুরুত্বপূর্ণ। Basic Authentication ছোট প্রকল্পের জন্য উপযুক্ত, তবে বৃহৎ এবং ক্রিটিকাল অ্যাপ্লিকেশনের জন্য উন্নত অথেনটিকেশন প্রোটোকল বিবেচনা করা উচিত।
Basic Authentication একটি সাধারণ অথেনটিকেশন প্রক্রিয়া, যা ব্যবহারকারীর username এবং password ব্যবহার করে প্রমাণীকরণ করে। এই প্রক্রিয়ায়, ব্যবহারকারীর username:password জোড়াকে Base64 এনকোডিং করা হয় এবং HTTP হেডারে Authorization ফিল্ডের মাধ্যমে সার্ভারে পাঠানো হয়।
HTTP হেডারে নিম্নলিখিত ফরম্যাটে তথ্য পাঠানো হয়:
Authorization: Basic Base64(username:password)
উদাহরণ:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
401 Unauthorized
স্ট্যাটাস পাঠায়।Authorization
হেডারে যোগ করে পুনরায় রিকোয়েস্ট পাঠায়।Spring Security Basic Authentication সহজেই কনফিগার করা যায়। নিচে উদাহরণ দেওয়া হলো:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
implementation 'org.springframework.boot:spring-boot-starter-security'
Spring Security-তে Basic Authentication সক্রিয় করতে একটি SecurityConfig
ক্লাস তৈরি করুন:
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.crypto.bcrypt.BCryptPasswordEncoder;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Public endpoints
.anyRequest().authenticated() // Other endpoints require authentication
.and()
.httpBasic(); // Enable Basic Authentication
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user")
.password(new BCryptPasswordEncoder().encode("password"))
.roles("USER")
.and()
.withUser("admin")
.password(new BCryptPasswordEncoder().encode("admin123"))
.roles("ADMIN");
}
}
একটি REST Controller
তৈরি করুন, যা Basic Authentication এর অধীনে সুরক্ষিত থাকবে:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@GetMapping("/public/hello")
public String publicHello() {
return "This is a public endpoint.";
}
@GetMapping("/secure/hello")
public String secureHello() {
return "This is a secure endpoint. Authentication successful!";
}
}
Basic Authentication সহজ, দ্রুত, এবং স্টেটলেস অথেনটিকেশন মেকানিজম প্রদান করে। এটি ছোট ও কমপ্লেক্সিটির অ্যাপ্লিকেশনের জন্য উপযুক্ত। তবে, ডেটার নিরাপত্তা নিশ্চিত করার জন্য HTTPS ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ। বড় ও জটিল অ্যাপ্লিকেশনের ক্ষেত্রে, JWT বা OAuth2 এর মতো উন্নত অথেনটিকেশন পদ্ধতির দিকে যাওয়া উচিত।
Basic Authentication হল একটি প্রমাণীকরণ পদ্ধতি, যেখানে ক্লায়েন্টের username
এবং password
Base64 Encoding ফরম্যাটে HTTP হেডারে প্রেরণ করা হয়। Spring Security-তে Basic Authentication কনফিগার করা খুব সহজ এবং এটি প্রাথমিক অথেন্টিকেশনের জন্য ব্যাপকভাবে ব্যবহৃত হয়।
pom.xml
ফাইলে Spring Security এর জন্য প্রয়োজনীয় ডিপেনডেন্সি যুক্ত করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Spring Security ব্যবহার করে Basic Authentication কনফিগার করতে নিচের ধাপগুলো অনুসরণ করুন:
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated() // প্রতিটি রিকোয়েস্ট অথেন্টিকেশন প্রয়োজন
.and()
.httpBasic(); // Basic Authentication সক্রিয়
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // পাসওয়ার্ড এনক্রিপশন
}
@Bean
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user") // ইন-মেমোরি ইউজার
.password(passwordEncoder().encode("password")) // পাসওয়ার্ড এনক্রিপ্ট করে সংরক্ষণ
.roles("USER")
.and()
.withUser("admin") // ইন-মেমোরি অ্যাডমিন
.password(passwordEncoder().encode("admin123"))
.roles("ADMIN");
}
}
Basic Authentication সক্রিয় করা:
http.httpBasic();
এটি Basic Authentication সক্রিয় করে এবং ক্লায়েন্টের HTTP রিকোয়েস্টের হেডার থেকে Authorization
তথ্য যাচাই করে।
BCryptPasswordEncoder
ব্যবহার করা হয়েছে।এন্ডপয়েন্ট সুরক্ষা:
http.authorizeRequests().anyRequest().authenticated();
সমস্ত এন্ডপয়েন্ট অথেন্টিকেশন ছাড়া অ্যাক্সেস করা যাবে না।
application.properties
ফাইলে অতিরিক্ত কনফিগারেশন (ঐচ্ছিক)server.port=8080
spring.security.user.name=defaultUser
spring.security.user.password=defaultPass
http://localhost:8080/your-endpoint
Basic Auth
নির্বাচন করুন।user
password
HTTP Header: HTTP রিকোয়েস্টের হেডারে একটি Authorization
হেডার প্রেরণ করা হবে:
Authorization: Basic dXNlcjpwYXNzd29yZA==
এখানে dXNlcjpwYXNzd29yZA==
হল user:password
এর Base64 Encoding।
Spring Security-তে রোল ভিত্তিক অ্যাক্সেস কনফিগার করা যায়।
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // শুধুমাত্র ADMIN রোলের জন্য
.antMatchers("/user/**").hasRole("USER") // শুধুমাত্র USER রোলের জন্য
.anyRequest().authenticated()
.and()
.httpBasic();
Basic Authentication API-এর জন্য CSRF Protection সাধারণত নিষ্ক্রিয় করা হয়, কারণ এটি স্টেটলেস (stateless) অ্যাপ্লিকেশনের জন্য উপযুক্ত নয়।
http.csrf().disable();
Spring Security দিয়ে Basic Authentication কনফিগার করা সহজ এবং দ্রুত কার্যকর হয়। এটি মূলত ছোট REST APIs বা স্টেটলেস অ্যাপ্লিকেশনের জন্য আদর্শ। বড় বা বেশি সুরক্ষিত অ্যাপ্লিকেশনগুলির জন্য OAuth2, JWT, বা Session-Based Authentication ব্যবহার করার পরামর্শ দেওয়া হয়।
Spring Security-এর মূল অংশ হলো HTTP স্তরে নিরাপত্তা নিশ্চিত করা। এই ক্ষেত্রে HttpSecurity এবং WebSecurityConfigurerAdapter ব্যবহৃত হয়।
Spring Security-তে WebSecurityConfigurerAdapter ছিল একটি প্রধান ক্লাস যা কাস্টম সিকিউরিটি কনফিগারেশন তৈরির জন্য ব্যবহৃত হত। তবে, Spring Security 5.7.0 থেকে WebSecurityConfigurerAdapter ডিপ্রিকেটেড হয়েছে। এর পরিবর্তে, এখন SecurityFilterChain ব্যবহার করা হয়।
যদিও WebSecurityConfigurerAdapter পুরোনো, এটি এখনও অনেক প্রকল্পে ব্যবহৃত হয়। এখানে আমরা WebSecurityConfigurerAdapter এবং এর আধুনিক বিকল্প HttpSecurity নিয়ে আলোচনা করব।
Spring Security ডিপেনডেন্সি যুক্ত করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
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;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Public endpoints
.antMatchers("/admin/**").hasRole("ADMIN") // Admin role only
.anyRequest().authenticated() // All other requests
.and()
.formLogin()
.loginPage("/login").permitAll() // Custom login page
.and()
.logout()
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin")
.password("{noop}admin123") // {noop} indicates no password encoding
.roles("ADMIN")
.and()
.withUser("user")
.password("{noop}user123")
.roles("USER");
}
}
Spring Security 5.7.0 থেকে SecurityFilterChain ব্যবহার করার পরামর্শ দেওয়া হয়। নিচে HttpSecurity এর আধুনিক ব্যবহার দেখানো হলো।
Spring Security এর ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll() // Public endpoints
.requestMatchers("/admin/**").hasRole("ADMIN") // Admin role only
.anyRequest().authenticated() // All other requests
)
.formLogin(form -> form
.loginPage("/login") // Custom login page
.permitAll()
)
.logout(logout -> logout
.permitAll()
);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Spring Boot অ্যাপ্লিকেশন চালানোর সময় In-Memory Authentication যুক্ত করা যায়:
@Bean
public InMemoryUserDetailsManager userDetailsService() {
return new InMemoryUserDetailsManager(
User.withUsername("admin")
.password(passwordEncoder().encode("admin123"))
.roles("ADMIN")
.build(),
User.withUsername("user")
.password(passwordEncoder().encode("user123"))
.roles("USER")
.build()
);
}
Authentication নিশ্চিত করতে HttpSecurity ব্যবহার করা হয়।
http
.authorizeHttpRequests(auth -> auth
.anyRequest().authenticated()
)
.formLogin()
.httpBasic();
Authorization এর মাধ্যমে নির্ধারণ করা হয় কোন ব্যবহারকারী কী অ্যাক্সেস করতে পারবে।
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().authenticated()
);
CSRF আক্রমণ প্রতিরোধ করতে HttpSecurity ডিফল্টভাবে সক্রিয় করে।
http.csrf().disable(); // Disable CSRF (not recommended for production)
http.formLogin()
.loginPage("/custom-login")
.permitAll();
http.logout()
.logoutUrl("/custom-logout")
.logoutSuccessUrl("/login?logout")
.permitAll();
বৈশিষ্ট্য | WebSecurityConfigurerAdapter | HttpSecurity with SecurityFilterChain |
---|---|---|
স্থিতি | Deprecated in Spring Security 5.7 | Recommended for new applications |
কাস্টমাইজেশন সহজতা | একক ক্লাসে সব কিছু ব্যবস্থাপনা | ক্লিনার এবং মডুলার কাঠামো |
মডিউলারিটি | কম মডিউলার | অধিক মডিউলার |
প্রযুক্তি সমর্থন | Spring Security এর পুরোনো সংস্করণ | Spring Security 5.7 এবং পরবর্তী সংস্করণ |
Spring Security-তে HttpSecurity এবং WebSecurityConfigurerAdapter নিরাপত্তা নিশ্চিত করার জন্য গুরুত্বপূর্ণ ভূমিকা পালন করে। WebSecurityConfigurerAdapter এখন ডিপ্রিকেটেড হওয়ায়, SecurityFilterChain এবং HttpSecurity ব্যবহার করার পরামর্শ দেওয়া হয়।
আপনার প্রয়োজন অনুযায়ী উদাহরণ বা সাহায্য চাইলে জানাতে পারেন!
Basic Authentication হল একটি সাধারণ অথেন্টিকেশন পদ্ধতি যেখানে ক্লায়েন্ট তার ক্রিডেনশিয়াল (ইউজারনেম এবং পাসওয়ার্ড) প্রতি রিকোয়েস্টের হেডারে Base64 এনকোড করা ফর্ম্যাটে প্রেরণ করে। Spring Security সহজেই Basic Authentication সাপোর্ট প্রদান করে।
Spring Boot ব্যবহার করলে spring-boot-starter-security
ডিপেনডেন্সি যুক্ত করুন।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Spring Boot-এ Spring Security যুক্ত করার পর Basic Authentication ডিফল্টভাবে সক্রিয় থাকে। ডিফল্ট সেটিংস:
/login
এন্ডপয়েন্ট প্রদান করা হয়।user
Spring Security-তে Basic Authentication কাস্টমাইজ করতে আপনাকে WebSecurityConfigurerAdapter
এক্সটেন্ড করতে হবে।
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.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
.csrf().disable() // CSRF সুরক্ষা বন্ধ (REST API-র ক্ষেত্রে সাধারণত বন্ধ রাখা হয়)
.authorizeRequests()
.antMatchers("/public/**").permitAll() // উন্মুক্ত রিসোর্স
.anyRequest().authenticated() // বাকি রিসোর্স অথেন্টিকেশন চায়
.and()
.httpBasic(); // Basic Authentication সক্রিয়
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN")
.and()
.withUser("user").password(passwordEncoder().encode("user")).roles("USER");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/public")
public String publicEndpoint() {
return "This is a public endpoint. No authentication required.";
}
@GetMapping("/private")
public String privateEndpoint() {
return "This is a private endpoint. Authentication required.";
}
}
Public Endpoint Access:
Public এন্ডপয়েন্ট অ্যাক্সেস করতে কোনো অথেন্টিকেশন প্রয়োজন হয় না।
curl http://localhost:8080/api/public
Output:
This is a public endpoint. No authentication required.
Private Endpoint Access:
Private এন্ডপয়েন্ট অ্যাক্সেস করতে Basic Authentication প্রয়োজন।
curl -u admin:admin http://localhost:8080/api/private
Output:
This is a private endpoint. Authentication required.
Basic Authentication-এর জন্য ক্লায়েন্টের রিকোয়েস্ট হেডারে একটি এনকোডেড টোকেন পাঠাতে হয়। উদাহরণ:
Base64 Encoding:
echo -n "username:password" | base64
যদি ইউজারনেম admin
এবং পাসওয়ার্ড admin
হয়, তাহলে Base64 এনকোডিং এর আউটপুট:
YWRtaW46YWRtaW4=
HTTP Header:
Authorization: Basic YWRtaW46YWRtaW4=
BCryptPasswordEncoder
ব্যবহার করা হয়।Spring Security-তে Basic Authentication দ্রুত সেটআপ এবং ব্যবহারযোগ্য একটি পদ্ধতি, যা ছোট বা অভ্যন্তরীণ অ্যাপ্লিকেশনের জন্য উপযুক্ত। বড় বা আরও সুরক্ষিত অ্যাপ্লিকেশনের জন্য OAuth2, JWT ইত্যাদি উন্নত অথেন্টিকেশন পদ্ধতি ব্যবহার করার পরামর্শ দেওয়া হয়।
Read more