Basic Authentication কী?
Basic Authentication হলো একটি সাধারণ অথেনটিকেশন পদ্ধতি যেখানে ব্যবহারকারীর ক্রেডেনশিয়াল (ইউজারনেম এবং পাসওয়ার্ড) HTTP হেডারের মাধ্যমে পাঠানো হয়। Spring Security ডিফল্টভাবে Basic Authentication সমর্থন করে।
Spring Security এ Basic Authentication সেটআপ
1. Maven ডিপেন্ডেন্সি যোগ করুন
pom.xml ফাইলে Spring Security এর ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. ডিফল্ট Basic Authentication
Spring Security যোগ করার পর কোনো অতিরিক্ত কনফিগারেশন ছাড়াই Basic Authentication সক্রিয় হয়। ডিফল্ট কনফিগারেশন:
- সব এন্ডপয়েন্ট সুরক্ষিত।
- ডিফল্ট ইউজারনেম:
user - ডিফল্ট পাসওয়ার্ড: কনসোলে জেনারেটেড পাসওয়ার্ড দেখা যাবে।
ডিফল্ট লগইন চেষ্টা করুন
একটি এন্ডপয়েন্ট যোগ করুন:
@RestController
public class TestController {
@GetMapping("/secured")
public String securedEndpoint() {
return "This is a secured endpoint";
}
}
এখন ব্রাউজারে /secured এন্ডপয়েন্ট অ্যাক্সেস করলে লগইন ডায়লগ দেখা যাবে।
3. কাস্টম Basic Authentication সেটআপ
ডিফল্ট কনফিগারেশন পরিবর্তন করতে হলে Spring Security কনফিগার করুন।
SecurityConfig ক্লাস তৈরি করুন
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");
}
}
4. Basic Authentication API কল করুন
HTTP ক্লায়েন্ট ব্যবহার করে
আপনার এন্ডপয়েন্ট অ্যাক্সেস করার জন্য HTTP ক্লায়েন্ট (যেমন Postman বা Curl) ব্যবহার করুন।
Postman দিয়ে পরীক্ষা করুন
- Postman খুলুন।
- HTTP মেথড:
GET। - URL:
http://localhost:8080/secured - Authorization ট্যাবে গিয়ে:
- টাইপ নির্বাচন করুন:
Basic Auth - ইউজারনেম:
user - পাসওয়ার্ড:
password
- টাইপ নির্বাচন করুন:
- Send প্রেস করুন।
cURL দিয়ে পরীক্ষা করুন
curl -u user:password http://localhost:8080/secured
5. ডাটাবেস-ভিত্তিক Basic Authentication
ইন-মেমরি অথেনটিকেশন পরিবর্তে ডাটাবেস থেকে ইউজার ডেটা লোড করার জন্য UserDetailsService ব্যবহার করা হয়।
CustomUserDetailsService ইমপ্লিমেন্ট করুন
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");
}
}
SecurityConfig এ UserDetailsService যুক্ত করুন
@Bean
public void configureGlobal(AuthenticationManagerBuilder auth, CustomUserDetailsService userDetailsService) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
6. Basic Authentication এর সেরা চর্চা
- SSL/TLS ব্যবহার করুন: Basic Authentication ব্যবহার করলে ব্যবহারকারীর ক্রেডেনশিয়াল এনক্রিপশন ছাড়াই পাঠানো হয়। তাই HTTPS (SSL/TLS) ব্যবহার করুন।
- Strong Password Encoding: পাসওয়ার্ড এনক্রিপশন নিশ্চিত করতে
BCryptPasswordEncoderব্যবহার করুন। Limited Endpoint Access: রোল বা পারমিশন অনুযায়ী এন্ডপয়েন্ট অ্যাক্সেস সীমাবদ্ধ করুন:
http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasRole("USER") .anyRequest().authenticated();- Rate Limiting: Brute Force আক্রমণ প্রতিরোধে Rate Limiting ব্যবহার করুন।
- JWT অথবা OAuth2 বিবেচনা করুন: Basic Authentication শুধুমাত্র ছোট এবং কমপ্লেক্সিটিসম্পন্ন অ্যাপ্লিকেশনের জন্য আদর্শ। বড় এবং স্কেলেবল অ্যাপ্লিকেশনের জন্য JWT অথবা OAuth2 বিবেচনা করুন।
উপসংহার
Spring Security এর Basic Authentication হলো অ্যাপ্লিকেশনের অথেনটিকেশন পরিচালনার একটি সহজ এবং কার্যকর পদ্ধতি। এটি ডিফল্টভাবে অন্তর্ভুক্ত থাকে এবং খুব দ্রুত সেটআপ করা যায়। তবে HTTPS এর মতো সিকিউরিটি চ্যানেল নিশ্চিত করা গুরুত্বপূর্ণ। Basic Authentication ছোট প্রকল্পের জন্য উপযুক্ত, তবে বৃহৎ এবং ক্রিটিকাল অ্যাপ্লিকেশনের জন্য উন্নত অথেনটিকেশন প্রোটোকল বিবেচনা করা উচিত।
Basic Authentication একটি সাধারণ অথেনটিকেশন প্রক্রিয়া, যা ব্যবহারকারীর username এবং password ব্যবহার করে প্রমাণীকরণ করে। এই প্রক্রিয়ায়, ব্যবহারকারীর username:password জোড়াকে Base64 এনকোডিং করা হয় এবং HTTP হেডারে Authorization ফিল্ডের মাধ্যমে সার্ভারে পাঠানো হয়।
Basic Authentication এর স্ট্রাকচার:
HTTP হেডারে নিম্নলিখিত ফরম্যাটে তথ্য পাঠানো হয়:
Authorization: Basic Base64(username:password)
উদাহরণ:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Basic Authentication এর কাজ করার পদ্ধতি
- ক্লায়েন্ট প্রথমে রিকোয়েস্ট পাঠায়।
- সার্ভার রেসপন্স করে এবং প্রমাণীকরণের জন্য
401 Unauthorizedস্ট্যাটাস পাঠায়। - ক্লায়েন্ট ব্যবহারকারীর username এবং password এর Base64 এনকোডেড তথ্য
Authorizationহেডারে যোগ করে পুনরায় রিকোয়েস্ট পাঠায়। - সার্ভার যদি প্রমাণীকরণ সফল হয়, তাহলে রিসোর্স অ্যাক্সেসের অনুমতি দেয়।
Basic Authentication এর প্রয়োজনীয়তা
- সহজ ইমপ্লিমেন্টেশন:
- Basic Authentication সহজে সেটআপ এবং ব্যবহার করা যায়।
- কোনো অতিরিক্ত জটিল সিস্টেম প্রয়োজন হয় না।
- Stateless Authentication:
- এটি স্টেটলেস, তাই সেশন ব্যবস্থাপনার প্রয়োজন হয় না। REST API এর জন্য এটি উপযুক্ত।
- Cross-Platform Support:
- Basic Authentication প্রায় সমস্ত HTTP ক্লায়েন্ট এবং ব্রাউজার সাপোর্ট করে।
- Quick Authentication Solution:
- ছোট বা দ্রুত ডেভেলপমেন্ট চাহিদার ক্ষেত্রে এটি একটি কার্যকর সমাধান।
Spring Security-তে Basic Authentication সেটআপ
Spring Security Basic Authentication সহজেই কনফিগার করা যায়। নিচে উদাহরণ দেওয়া হলো:
১. Maven/Gradle ডিপেন্ডেন্সি যোগ করা
Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Gradle:
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 এর সীমাবদ্ধতা
- Security Vulnerability:
- Base64 এনকোডিং পাসওয়ার্ডকে সুরক্ষিত করে না। এটি সহজেই ডিকোড করা যায়।
- HTTPS (SSL/TLS) ব্যবহার না করলে ডেটা হাইজ্যাকিং হতে পারে।
- Username/Password প্রতিবার পাঠানো:
- প্রতিটি রিকোয়েস্টে username এবং password প্রেরণ করা হয়, যা নিরাপত্তার জন্য ঝুঁকিপূর্ণ।
- Stateless Nature:
- এটি স্টেটলেস, তাই লগআউট মেকানিজম সহজ নয়।
- Token-Based Alternatives:
- JWT বা OAuth2 এর মতো উন্নত প্রমাণীকরণ পদ্ধতি Basic Authentication এর তুলনায় আরও বেশি নিরাপদ।
Basic Authentication এর নিরাপত্তা নিশ্চিত করতে করণীয়
- HTTPS ব্যবহার করুন:
- HTTP-এর পরিবর্তে HTTPS ব্যবহার করা আবশ্যক, যাতে ডেটা এনক্রিপ্ট থাকে।
- Password Encoding:
- পাসওয়ার্ড এনক্রিপশন (যেমন BCrypt) নিশ্চিত করতে হবে।
- Timeout এবং IP Restriction:
- অতিরিক্ত সুরক্ষার জন্য সেশন টাইমআউট এবং নির্দিষ্ট IP থেকে অ্যাক্সেস সীমাবদ্ধ করুন।
উপসংহার
Basic Authentication সহজ, দ্রুত, এবং স্টেটলেস অথেনটিকেশন মেকানিজম প্রদান করে। এটি ছোট ও কমপ্লেক্সিটির অ্যাপ্লিকেশনের জন্য উপযুক্ত। তবে, ডেটার নিরাপত্তা নিশ্চিত করার জন্য HTTPS ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ। বড় ও জটিল অ্যাপ্লিকেশনের ক্ষেত্রে, JWT বা OAuth2 এর মতো উন্নত অথেনটিকেশন পদ্ধতির দিকে যাওয়া উচিত।
Basic Authentication হল একটি প্রমাণীকরণ পদ্ধতি, যেখানে ক্লায়েন্টের username এবং password Base64 Encoding ফরম্যাটে HTTP হেডারে প্রেরণ করা হয়। Spring Security-তে Basic Authentication কনফিগার করা খুব সহজ এবং এটি প্রাথমিক অথেন্টিকেশনের জন্য ব্যাপকভাবে ব্যবহৃত হয়।
Spring Security-তে Basic Authentication এর কনফিগারেশন ধাপসমূহ
১. Maven ডিপেনডেন্সি যোগ করা
pom.xml ফাইলে Spring Security এর জন্য প্রয়োজনীয় ডিপেনডেন্সি যুক্ত করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
২. Basic Authentication কনফিগারেশন
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তথ্য যাচাই করে।- ইউজার এবং পাসওয়ার্ড সংরক্ষণ: ইন-মেমোরি অথেন্টিকেশন ব্যবহার করে ইউজার এবং পাসওয়ার্ড কনফিগার করা হয়েছে।
- PasswordEncoder ব্যবহার:
Spring Security ডিফল্টভাবে এনক্রিপ্ট করা পাসওয়ার্ড ব্যবহার করে। এখানেBCryptPasswordEncoderব্যবহার করা হয়েছে। এন্ডপয়েন্ট সুরক্ষা:
http.authorizeRequests().anyRequest().authenticated();সমস্ত এন্ডপয়েন্ট অথেন্টিকেশন ছাড়া অ্যাক্সেস করা যাবে না।
৪. application.properties ফাইলে অতিরিক্ত কনফিগারেশন (ঐচ্ছিক)
server.port=8080
spring.security.user.name=defaultUser
spring.security.user.password=defaultPass
৫. Basic Authentication পরীক্ষা করা
Postman দিয়ে পরীক্ষা:
- GET রিকোয়েস্ট প্রেরণ:
- URL:
http://localhost:8080/your-endpoint - Authentication ট্যাবে গিয়ে
Basic Authনির্বাচন করুন। - Username:
user - Password:
password
- URL:
HTTP Header: HTTP রিকোয়েস্টের হেডারে একটি
Authorizationহেডার প্রেরণ করা হবে:Authorization: Basic dXNlcjpwYXNzd29yZA==এখানে
dXNlcjpwYXNzd29yZA==হলuser:passwordএর Base64 Encoding।
৬. Advanced Configuration: Role-Based Access Control
Spring Security-তে রোল ভিত্তিক অ্যাক্সেস কনফিগার করা যায়।
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // শুধুমাত্র ADMIN রোলের জন্য
.antMatchers("/user/**").hasRole("USER") // শুধুমাত্র USER রোলের জন্য
.anyRequest().authenticated()
.and()
.httpBasic();
৭. CSRF সুরক্ষা
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 ব্যবহৃত হয়।
WebSecurityConfigurerAdapter
Spring Security-তে WebSecurityConfigurerAdapter ছিল একটি প্রধান ক্লাস যা কাস্টম সিকিউরিটি কনফিগারেশন তৈরির জন্য ব্যবহৃত হত। তবে, Spring Security 5.7.0 থেকে WebSecurityConfigurerAdapter ডিপ্রিকেটেড হয়েছে। এর পরিবর্তে, এখন SecurityFilterChain ব্যবহার করা হয়।
যদিও WebSecurityConfigurerAdapter পুরোনো, এটি এখনও অনেক প্রকল্পে ব্যবহৃত হয়। এখানে আমরা WebSecurityConfigurerAdapter এবং এর আধুনিক বিকল্প HttpSecurity নিয়ে আলোচনা করব।
WebSecurityConfigurerAdapter ব্যবহার (Deprecated)
১. Maven Dependency যোগ করা
Spring Security ডিপেনডেন্সি যুক্ত করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
২. WebSecurityConfigurerAdapter ক্লাস তৈরি
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");
}
}
HttpSecurity ব্যবহার (Modern Approach)
Spring Security 5.7.0 থেকে SecurityFilterChain ব্যবহার করার পরামর্শ দেওয়া হয়। নিচে HttpSecurity এর আধুনিক ব্যবহার দেখানো হলো।
১. Maven Dependency যোগ করা
Spring Security এর ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
২. SecurityFilterChain এবং HttpSecurity ব্যবহার
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();
}
}
৩. In-Memory Authentication ব্যবহার
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()
);
}
HttpSecurity-এর গুরুত্বপূর্ণ বৈশিষ্ট্য
১. Authentication
Authentication নিশ্চিত করতে HttpSecurity ব্যবহার করা হয়।
http
.authorizeHttpRequests(auth -> auth
.anyRequest().authenticated()
)
.formLogin()
.httpBasic();
২. Authorization
Authorization এর মাধ্যমে নির্ধারণ করা হয় কোন ব্যবহারকারী কী অ্যাক্সেস করতে পারবে।
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().authenticated()
);
৩. CSRF Protection
CSRF আক্রমণ প্রতিরোধ করতে HttpSecurity ডিফল্টভাবে সক্রিয় করে।
http.csrf().disable(); // Disable CSRF (not recommended for production)
৪. Custom Login Page
http.formLogin()
.loginPage("/custom-login")
.permitAll();
৫. Logout Configuration
http.logout()
.logoutUrl("/custom-logout")
.logoutSuccessUrl("/login?logout")
.permitAll();
WebSecurityConfigurerAdapter এবং HttpSecurity-এর তুলনা
| বৈশিষ্ট্য | 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 সাপোর্ট প্রদান করে।
Basic Authentication-এর বৈশিষ্ট্য
- সহজ এবং দ্রুত সেটআপ।
- প্রতিটি রিকোয়েস্টে ক্লায়েন্টের ক্রিডেনশিয়াল প্রেরণ করা হয়।
- সাধারণত HTTPS এর মাধ্যমে ব্যবহৃত হয়, কারণ এটি নিরাপত্তার জন্য অত্যন্ত গুরুত্বপূর্ণ।
Spring Security-এ Basic Authentication বাস্তবায়ন
Step 1: Maven ডিপেনডেন্সি যোগ করা
Spring Boot ব্যবহার করলে spring-boot-starter-security ডিপেনডেন্সি যুক্ত করুন।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Step 2: ডিফল্ট Basic Authentication
Spring Boot-এ Spring Security যুক্ত করার পর Basic Authentication ডিফল্টভাবে সক্রিয় থাকে। ডিফল্ট সেটিংস:
/loginএন্ডপয়েন্ট প্রদান করা হয়।- ডিফল্ট ইউজারনেম:
user - অ্যাপ্লিকেশন চালানোর সময় কনসোলে জেনারেট হওয়া একটি পাসওয়ার্ড।
Step 3: Custom Basic Authentication Configuration
Spring Security-তে Basic Authentication কাস্টমাইজ করতে আপনাকে WebSecurityConfigurerAdapter এক্সটেন্ড করতে হবে।
Example Code:
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();
}
}
Step 4: API Endpoint তৈরি
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.";
}
}
Step 5: Postman বা Curl দিয়ে টেস্ট করা
Public Endpoint Access:
Public এন্ডপয়েন্ট অ্যাক্সেস করতে কোনো অথেন্টিকেশন প্রয়োজন হয় না।
curl http://localhost:8080/api/publicOutput:
This is a public endpoint. No authentication required.Private Endpoint Access:
Private এন্ডপয়েন্ট অ্যাক্সেস করতে Basic Authentication প্রয়োজন।
curl -u admin:admin http://localhost:8080/api/privateOutput:
This is a private endpoint. Authentication required.
Step 6: HTTP Request-এর Basic Authentication Header
Basic Authentication-এর জন্য ক্লায়েন্টের রিকোয়েস্ট হেডারে একটি এনকোডেড টোকেন পাঠাতে হয়। উদাহরণ:
Base64 Encoding:
echo -n "username:password" | base64যদি ইউজারনেম
adminএবং পাসওয়ার্ডadminহয়, তাহলে Base64 এনকোডিং এর আউটপুট:YWRtaW46YWRtaW4=HTTP Header:
Authorization: Basic YWRtaW46YWRtaW4=
Spring Boot-এ Basic Authentication-এর ডিফল্ট বৈশিষ্ট্য
- User Details Service:
Spring Security ইন-মেমরি অথেন্টিকেশন অথবা ডাটাবেসের মাধ্যমে ইউজার তথ্য সংরক্ষণ করে। - Password Encoding:
Spring Security পাসওয়ার্ড নিরাপদ রাখতে এনকোডিং ব্যবহার করে। ডিফল্টভাবেBCryptPasswordEncoderব্যবহার করা হয়।
Basic Authentication-এর ব্যবহার ক্ষেত্র
- Internal API Communication:
যেখানে ক্লায়েন্ট ও সার্ভার একে অপরের উপর নির্ভরশীল। - Development Environments:
সুরক্ষার জন্য সহজ অথেন্টিকেশন। - Simple Applications:
যেখানে উন্নত অথেন্টিকেশন (যেমন JWT বা OAuth2) প্রয়োজন নেই।
Basic Authentication-এর চ্যালেঞ্জ
- Security Vulnerabilities:
Base64 এনকোডিং সুরক্ষিত নয়; HTTPS ব্যবহার না করলে ম্যান-ইন-দ্য-মিডল আক্রমণ সম্ভব। - Token Reusability:
প্রতিটি রিকোয়েস্টে ক্রিডেনশিয়াল প্রেরণের কারণে সেশন হাইজ্যাকিংয়ের ঝুঁকি। - Limited Scalability:
বড় স্কেলে ব্যবহারের জন্য Basic Authentication যথেষ্ট নয়।
উপসংহার
Spring Security-তে Basic Authentication দ্রুত সেটআপ এবং ব্যবহারযোগ্য একটি পদ্ধতি, যা ছোট বা অভ্যন্তরীণ অ্যাপ্লিকেশনের জন্য উপযুক্ত। বড় বা আরও সুরক্ষিত অ্যাপ্লিকেশনের জন্য OAuth2, JWT ইত্যাদি উন্নত অথেন্টিকেশন পদ্ধতি ব্যবহার করার পরামর্শ দেওয়া হয়।
Read more