Spring Security তে access control করতে আমরা @PreAuthorize এবং @Secured অ্যানোটেশন ব্যবহার করতে পারি। এই অ্যানোটেশনগুলি মেথড লেভেলে ব্যবহার করা হয়, যার মাধ্যমে নির্দিষ্ট রোল বা অনুমতির ভিত্তিতে রিকোয়েস্টের অ্যাক্সেস কন্ট্রোল করা যায়।
1. @Secured অ্যানোটেশন
@Secured অ্যানোটেশনটি Spring Security-তে ব্যবহারকারীর রোল (roles) অনুযায়ী মেথড অ্যাক্সেস কন্ট্রোল করার জন্য ব্যবহৃত হয়। এই অ্যানোটেশনটি মেথডের আগে ব্যবহার করা হয়, যা একটি নির্দিষ্ট রোলের অধিকারী ব্যবহারকারী ছাড়া অন্যদের অ্যাক্সেস বন্ধ করে।
@Secured Example:
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Secured("ROLE_ADMIN")
public void deleteUser() {
System.out.println("Admin deleted the user.");
}
@Secured({"ROLE_USER", "ROLE_ADMIN"})
public void viewUser() {
System.out.println("User details viewed.");
}
}
- @Secured("ROLE_ADMIN"): এটি নিশ্চিত করে যে শুধুমাত্র ROLE_ADMIN রোলধারী ব্যবহারকারী deleteUser() মেথডটি অ্যাক্সেস করতে পারবে।
- @Secured({"ROLE_USER", "ROLE_ADMIN"}): এটি ROLE_USER এবং ROLE_ADMIN রোলধারী উভয় ব্যবহারকারীকে viewUser() মেথডে অ্যাক্সেস প্রদান করবে।
Configuring Spring Security for @Secured
Spring Security তে @Secured অ্যানোটেশন ব্যবহার করার জন্য @EnableGlobalMethodSecurity কনফিগারেশন প্রয়োজন।
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true) // Enable @Secured
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// Security configuration
}
2. @PreAuthorize অ্যানোটেশন
@PreAuthorize অ্যানোটেশনটি একটি শক্তিশালী এবং নমনীয় পদ্ধতি, যা Spring Expression Language (SpEL) ব্যবহার করে কাস্টম শর্তাবলী নির্ধারণ করতে সহায়ক। এটি মেথডের আগে এক্সপ্রেশন চেক করে অ্যাক্সেস নিয়ন্ত্রণ করে।
@PreAuthorize Example:
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void createProduct() {
System.out.println("Product created by Admin.");
}
@PreAuthorize("hasPermission(#product, 'read')")
public void viewProduct(Product product) {
System.out.println("Product details viewed by the user.");
}
@PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
public void updateProduct() {
System.out.println("Product updated by User or Admin.");
}
}
- @PreAuthorize("hasRole('ROLE_ADMIN')"): এটি নিশ্চিত করে যে শুধুমাত্র ROLE_ADMIN রোলধারী ব্যবহারকারী createProduct() মেথডটি অ্যাক্সেস করতে পারবে।
- @PreAuthorize("hasPermission(#product, 'read')"): এটি #product অবজেক্টের ওপর
readপারমিশন চেক করবে এবং কেবলমাত্র সেই ব্যবহারকারী যার কাছে এই পারমিশন রয়েছে, সে viewProduct() মেথডটি অ্যাক্সেস করতে পারবে। - @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')"): এটি নিশ্চিত করে যে ROLE_USER অথবা ROLE_ADMIN রোলধারী ব্যবহারকারী updateProduct() মেথডটি অ্যাক্সেস করতে পারবে।
Configuring Spring Security for @PreAuthorize
Spring Security তে @PreAuthorize ব্যবহার করতে @EnableGlobalMethodSecurity(prePostEnabled = true) কনফিগারেশন করতে হয়।
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) // Enable @PreAuthorize
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// Security configuration
}
3. @Secured এবং @PreAuthorize এর মধ্যে পার্থক্য
| Feature | @Secured | @PreAuthorize |
|---|---|---|
| Basic Purpose | রোল ভিত্তিক অ্যাক্সেস কন্ট্রোল | SpEL এর মাধ্যমে কাস্টম শর্তাবলী দিয়ে অ্যাক্সেস কন্ট্রোল |
| Expression Support | No | Yes (SpEL expressions support) |
| Use Case | সহজ রোল ভিত্তিক নিরাপত্তা নিয়ন্ত্রণ | কাস্টম শর্তাবলী, পারমিশন চেক, এবং আরও উন্নত কন্ট্রোল |
| Example | @Secured("ROLE_ADMIN") | @PreAuthorize("hasRole('ROLE_ADMIN')") |
4. @Secured এবং @PreAuthorize এর ব্যবহার ক্ষেত্রে উদাহরণ
@Secured Example:
@Secured("ROLE_ADMIN")
public void deleteProduct() {
// Only Admin can delete product
}
@PreAuthorize Example:
@PreAuthorize("hasRole('ROLE_ADMIN') and #product.price > 1000")
public void discountProduct(Product product) {
// Admin can discount products with price greater than 1000
}
Complex Example with @PreAuthorize:
@PreAuthorize("hasRole('ROLE_ADMIN') or (hasRole('ROLE_USER') and #product.owner == authentication.name)")
public void updateProductDetails(Product product) {
// Admin can update, or User can update their own product
}
5. Conclusion
Spring Security তে @Secured এবং @PreAuthorize অ্যানোটেশন দুটি powerful tool যা মেথড লেভেলে access control পরিচালনা করতে সহায়ক। @Secured সোজা রোল ভিত্তিক কন্ট্রোল প্রদান করে, যেখানে @PreAuthorize অধিক নমনীয় এবং Spring Expression Language (SpEL) এর মাধ্যমে কাস্টম access control তৈরির সুযোগ দেয়।
- @Secured: সাধারণত রোল বা প্রিভিলেজ ভিত্তিক অ্যাক্সেস কন্ট্রোলের জন্য ব্যবহৃত হয়।
- @PreAuthorize: কাস্টম শর্তাবলী বা স্পেসিফিক পারমিশন ভিত্তিক অ্যাক্সেস কন্ট্রোলের জন্য ব্যবহৃত হয়, যা আরও জটিল সিকিউরিটি চেক করতে সক্ষম।
@PreAuthorize এবং @Secured এর মাধ্যমে আপনি Spring MVC অ্যাপ্লিকেশনে শক্তিশালী এবং নমনীয় নিরাপত্তা ব্যবস্থা তৈরি করতে পারেন।
Read more