Spring Security এবং Spring MVC একত্রে ব্যবহৃত হলে, এটি ওয়েব অ্যাপ্লিকেশনের নিরাপত্তা প্রদান করে এবং একই সময়ে ডেটা বা রিসোর্সের অ্যাক্সেস নিয়ন্ত্রণ করে। Spring MVC ওয়েব রিকোয়েস্ট পরিচালনার জন্য এবং Spring Security ব্যবহারকারীর প্রমাণীকরণ (authentication) ও অনুমোদন (authorization) নিয়ন্ত্রণ করার জন্য ব্যবহৃত হয়।
এখানে আমরা একটি সাধারন উদাহরণ দেখাবো যেখানে Spring Security এবং Spring MVC একত্রে ব্যবহৃত হয়েছে:
- Spring Security ব্যবহার করে authentication এবং authorization সেটআপ করা।
- Spring MVC ব্যবহার করে ইউজার ইন্টারফেস (views) তৈরি করা।
- নির্দিষ্ট রোলের জন্য অনুমতি নির্ধারণ করা।
Step 1: Spring Boot Dependencies
প্রথমে, Spring Boot অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় ডিপেনডেন্সি যোগ করতে হবে:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
spring-boot-starter-web: Spring MVC এবং RESTful অ্যাপ্লিকেশন তৈরি করতে ব্যবহার হয়।spring-boot-starter-security: Spring Security ব্যবহারের জন্য।spring-boot-starter-thymeleaf: UI টেমপ্লেট ইঞ্জিন হিসেবে Thymeleaf ব্যবহারের জন্য।
Step 2: Spring Security Configuration
Spring Security কনফিগারেশন তৈরির জন্য একটি কনফিগারেশন ক্লাস তৈরি করতে হবে যেখানে আপনি authentication এবং authorization কনফিগার করবেন।
SecurityConfig.java (Spring 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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.memory.InMemoryUserDetailsManager;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
// Define in-memory users with roles
manager.createUser(User.withUsername("admin").password(passwordEncoder().encode("admin123")).roles("ADMIN").build());
manager.createUser(User.withUsername("user").password(passwordEncoder().encode("user123")).roles("USER").build());
return manager;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // Use BCryptPasswordEncoder for password encoding
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // Only accessible by ADMIN role
.antMatchers("/user/**").hasAnyRole("USER", "ADMIN") // Accessible by USER and ADMIN roles
.anyRequest().authenticated() // All other requests need authentication
.and()
.formLogin()
.loginPage("/login") // Custom login page
.permitAll()
.and()
.logout()
.permitAll();
return http.build();
}
}
InMemoryUserDetailsManager: এটি ব্যবহারকারী তথ্য (যেমন username, password, roles) ইন-মেমরি (RAM) সংরক্ষণ করে।BCryptPasswordEncoder: এটি নিরাপদ পাসওয়ার্ড এনকোডিং এর জন্য ব্যবহৃত হয়।HttpSecurity: এটি নিরাপত্তা কনফিগারেশন করতে ব্যবহৃত হয়, যেমনformLogin()দিয়ে কাস্টম লগিন পেজ তৈরি করা এবংauthorizeRequests()দিয়ে URL পাথের জন্য রোল ভিত্তিক অনুমতি নির্ধারণ করা।
Step 3: Controller Class
এখন Spring MVC কন্ট্রোলার তৈরি করি যেখানে আপনি ভিউ এবং রিকোয়েস্ট হ্যান্ডলিং করবেন।
HomeController.java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@RequestMapping("/home")
public String home() {
return "home"; // Returns 'home.html' or 'home.jsp'
}
@GetMapping("/user/dashboard")
public String userDashboard() {
return "user/dashboard"; // Returns 'user/dashboard.html'
}
@GetMapping("/admin/dashboard")
public String adminDashboard() {
return "admin/dashboard"; // Returns 'admin/dashboard.html'
}
@GetMapping("/login")
public String login() {
return "login"; // Returns 'login.html'
}
}
@RequestMapping("/home"): সাধারণ ব্যবহারকারীর জন্য হোম পেজ রেন্ডার করার জন্য।@GetMapping("/user/dashboard"): USER রোলের জন্য ড্যাশবোর্ড পেজ।@GetMapping("/admin/dashboard"): ADMIN রোলের জন্য ড্যাশবোর্ড পেজ।
Step 4: Thymeleaf Templates
Thymeleaf ব্যবহার করে HTML টেমপ্লেট তৈরি করা হবে, যাতে ইউজার ইন্টারফেস তৈরি করা যাবে।
home.html (Home Page)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Home Page</title>
</head>
<body>
<h1>Welcome to the Home Page!</h1>
<p><a href="/user/dashboard">Go to User Dashboard</a></p>
<p><a href="/admin/dashboard">Go to Admin Dashboard</a></p>
</body>
</html>
login.html (Login Page)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Login Page</title>
</head>
<body>
<h1>Please Log In</h1>
<form action="/login" method="post">
<label>Username:</label><input type="text" name="username" /><br />
<label>Password:</label><input type="password" name="password" /><br />
<button type="submit">Log In</button>
</form>
</body>
</html>
user/dashboard.html (User Dashboard Page)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>User Dashboard</title>
</head>
<body>
<h1>Welcome, User!</h1>
<p>You have access to the User Dashboard.</p>
<a href="/home">Back to Home</a>
</body>
</html>
admin/dashboard.html (Admin Dashboard Page)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Admin Dashboard</title>
</head>
<body>
<h1>Welcome, Admin!</h1>
<p>You have access to the Admin Dashboard.</p>
<a href="/home">Back to Home</a>
</body>
</html>
Step 5: Running the Application
Spring Boot অ্যাপ্লিকেশন রান করতে MyApplication.java ক্লাস তৈরি করুন:
MyApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@SpringBootApplication: এটি Spring Boot অ্যাপ্লিকেশন কনফিগারেশনের মূল অ্যানোটেশন যা সমস্ত প্রয়োজনীয় কনফিগারেশন সঠিকভাবে লোড করবে।
Conclusion
এই উদাহরণটি দেখায় কীভাবে Spring Security এবং Spring MVC একত্রে ব্যবহৃত হয়:
- Spring Security দ্বারা ব্যবহারকারীকে নিরাপত্তা প্রদান করা হয় (প্রমাণীকরণ এবং অনুমোদন)।
- Spring MVC দিয়ে HTTP রিকোয়েস্ট হ্যান্ডল করা হয় এবং বিভিন্ন ইউজার রোল (ADMIN, USER) অনুযায়ী ভিউ রেন্ডার করা হয়।
এই উদাহরণের মাধ্যমে আপনি Spring Security এবং Spring MVC এর মধ্যে ইন্টিগ্রেশন করতে পারবেন, যা আপনাকে নিরাপদ এবং শক্তিশালী ওয়েব অ্যাপ্লিকেশন তৈরি করতে সহায়তা করবে।
Read more