Spring Boot অ্যাপ্লিকেশনে সিকিউরিটি ম্যানেজমেন্ট অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে যখন আপনি একটি ওয়েব অ্যাপ্লিকেশন তৈরি করেন, যেখানে ব্যবহারকারীদের অনুমতি এবং নিরাপত্তা বজায় রাখা প্রয়োজন। Spring Boot এ সিকিউরিটি ব্যবস্থাপনা Spring Security ব্যবহার করে সম্পন্ন করা হয়। Spring Security একটি শক্তিশালী ফ্রেমওয়ার্ক, যা অ্যাপ্লিকেশনের নিরাপত্তা যেমন অথেন্টিকেশন (Authentication), অথরাইজেশন (Authorization), এবং অন্যান্য নিরাপত্তা ফিচার ম্যানেজ করে।
এখানে Spring Boot এর সাথে Spring Security ব্যবহার করে একটি সিকিউরিটি ম্যানেজমেন্ট সিস্টেম তৈরি করার উদাহরণ দেয়া হলো।
1. প্রয়োজনীয় ডিপেনডেন্সি ইনস্টল করা
Spring Boot অ্যাপ্লিকেশনে সিকিউরিটি ব্যবস্থাপনা সেটআপ করার জন্য, প্রথমে spring-boot-starter-security ডিপেনডেন্সি pom.xml ফাইলে যোগ করতে হবে।
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
এখানে, spring-boot-starter-security ডিপেনডেন্সি Spring Security এর মূল কার্যকারিতা প্রদান করে।
2. Spring Security কনফিগারেশন
Spring Security কনফিগারেশন সাধারণত WebSecurityConfigurerAdapter ক্লাস এক্সটেন্ড করে করা হয়। এই ক্লাসে আপনি নিরাপত্তার বিভিন্ন সেটিংস কনফিগার করতে পারবেন যেমন ইউজার অথেন্টিকেশন, অথরাইজেশন, এবং কাস্টম ইউজার ডিটেইলস সার্ভিস।
2.1 কাস্টম সিকিউরিটি কনফিগারেশন
package com.example.helloworld.config;
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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
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;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// HTTP Security কনফিগারেশন
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // শুধুমাত্র ADMIN রোলের জন্য
.antMatchers("/user/**").hasAnyRole("USER", "ADMIN") // USER বা ADMIN রোলের জন্য
.antMatchers("/").permitAll() // হোম পেজ সকলের জন্য উন্মুক্ত
.and()
.formLogin() // ফর্ম লগিন পেজ সক্রিয় করা
.permitAll() // লগিন পেজ সকলের জন্য উন্মুক্ত
.and()
.logout() // লগ আউট ফিচার সক্রিয় করা
.permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
@Bean
public UserDetailsService userDetailsService() {
var user1 = User.withUsername("user")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
var admin = User.withUsername("admin")
.password(passwordEncoder().encode("admin"))
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user1, admin);
}
}
এখানে:
http.authorizeRequests(): আমরা URL পাথের জন্য নিরাপত্তা বিধি তৈরি করেছি। যেমন,/admin/**পাথ শুধুমাত্রADMINরোলের জন্য অ্যাক্সেসযোগ্য।passwordEncoder(): এটি একটিPasswordEncoderBean যা ব্যবহারকারীর পাসওয়ার্ড এনক্রিপ্ট করবে। এখানেBCryptPasswordEncoderব্যবহার করা হয়েছে।userDetailsService(): ইন-মেমরি ইউজার ডিটেইলস ম্যানেজমেন্টের জন্যInMemoryUserDetailsManagerব্যবহার করা হয়েছে। এখানে দুটি ইউজার,userএবংadminতৈরি করা হয়েছে।
3. লগইন পেজ তৈরি করা
Spring Security ডিফল্টভাবে একটি লগইন ফর্ম তৈরি করে, তবে আপনি কাস্টম লগইন পেজও তৈরি করতে পারেন। এখানে, আমরা একটি সাধারণ কাস্টম লগইন পেজ তৈরি করব।
3.1 লগইন পেজ তৈরি করা
src/main/resources/templates/login.html ফাইলে একটি সিম্পল HTML ফর্ম তৈরি করা হয়েছে:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<form action="/login" method="post">
<label for="username">Username:</label><br>
<input type="text" id="username" name="username" required><br><br>
<label for="password">Password:</label><br>
<input type="password" id="password" name="password" required><br><br>
<button type="submit">Login</button>
</form>
</body>
</html>
এটি একটি সাধারণ লগইন ফর্ম যা ব্যবহারকারীর নাম এবং পাসওয়ার্ড নেয় এবং /login পাথের দিকে POST রিকোয়েস্ট পাঠায়।
4. Controller তৈরি করা
এখন, আমাদের একটি Controller তৈরি করতে হবে যা বিভিন্ন রোলের জন্য অ্যাক্সেস প্রদান করবে এবং লগইন সফল হলে রেসপন্স দেবে।
4.1 Controller উদাহরণ
package com.example.helloworld.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "Welcome to the home page!";
}
@GetMapping("/user")
public String userPage() {
return "Welcome User!";
}
@GetMapping("/admin")
public String adminPage() {
return "Welcome Admin!";
}
}
এখানে, /user পাথ ইউজারদের জন্য, /admin পাথ অ্যাডমিনদের জন্য এবং / পাথ সকলের জন্য উন্মুক্ত রয়েছে।
5. Spring Security কনফিগারেশন কার্যকর করা
Spring Security কনফিগারেশন স্বয়ংক্রিয়ভাবে Spring Boot অ্যাপ্লিকেশনে কার্যকর হয়ে যাবে। এই কনফিগারেশন অনুযায়ী, /admin/** পাথ শুধুমাত্র ADMIN রোলের ইউজারের জন্য অ্যাক্সেসযোগ্য, /user/** পাথ USER এবং ADMIN রোল উভয়ের জন্য অ্যাক্সেসযোগ্য, এবং / পাথ সকলের জন্য উন্মুক্ত থাকবে।
সারাংশ
Spring Boot এবং Spring Security ব্যবহার করে সিকিউরিটি ম্যানেজমেন্ট সহজভাবে সম্পন্ন করা যায়। @Configuration এবং WebSecurityConfigurerAdapter ক্লাসের মাধ্যমে কাস্টম সিকিউরিটি কনফিগারেশন তৈরি করা হয়। BCryptPasswordEncoder ব্যবহার করে পাসওয়ার্ড এনক্রিপ্ট করা হয় এবং InMemoryUserDetailsManager ব্যবহার করে ইউজার ডিটেইলস ম্যানেজ করা হয়। লগইন পেজ কাস্টমাইজ করা যায় এবং রোল-ভিত্তিক অথরাইজেশন প্রয়োগ করা যায়। Spring Security নিরাপত্তা বজায় রাখতে সহায়ক একটি শক্তিশালী টুল।
Read more