Spring Security একটি শক্তিশালী এবং কাস্টমাইজেবল ফ্রেমওয়ার্ক যা অ্যাপ্লিকেশনে নিরাপত্তা প্রদান করতে ব্যবহৃত হয়। এটি মূলত Authentication (ব্যবহারকারীর পরিচয় যাচাই) এবং Authorization (ব্যবহারকারীর অ্যাক্সেস অনুমতি) নিশ্চিত করার জন্য ব্যবহৃত হয়। Spring Security ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনে ব্যবহারকারীর লগইন এবং নিরাপত্তা নীতি সহজভাবে ইমপ্লিমেন্ট করতে পারেন।
এখানে Spring Security দিয়ে Authentication এবং Authorization সেটআপ করার পদ্ধতি আলোচনা করা হবে।
Authentication এবং Authorization এর মধ্যে পার্থক্য
- Authentication (অথেনটিকেশন): এটি হল একটি প্রক্রিয়া যার মাধ্যমে আমরা যাচাই করি যে ব্যবহারকারী যে পরিচয় দাবি করছে, সেটি সঠিক কি না। সাধারণত, এটি ব্যবহারকারীর ইউজারনেম এবং পাসওয়ার্ডের মাধ্যমে করা হয়।
- Authorization (অথোরাইজেশন): এটি হল একটি প্রক্রিয়া যার মাধ্যমে নির্ধারণ করা হয় যে ব্যবহারকারী একটি নির্দিষ্ট রিসোর্স বা অ্যাপ্লিকেশন ফিচারে অ্যাক্সেস পাবে কিনা।
Spring Security দিয়ে Authentication
Spring Security দিয়ে Authentication প্রক্রিয়াটি সহজে কনফিগার করা যায়। Spring Security দিয়ে ইউজারনেম এবং পাসওয়ার্ডের মাধ্যমে লগইন সিস্টেম তৈরি করা হয়। এজন্য নিম্নলিখিত স্টেপগুলি অনুসরণ করা যেতে পারে:
১. Spring Security Dependency যুক্ত করা
প্রথমে আপনার pom.xml ফাইলে Spring Security এর ডিপেনডেন্সি যুক্ত করতে হবে:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
২. WebSecurityConfigurerAdapter কনফিগারেশন
Spring Security কনফিগার করার জন্য একটি কাস্টম কনফিগারেশন ক্লাস তৈরি করতে হবে যা WebSecurityConfigurerAdapter এক্সটেন্ড করবে। উদাহরণস্বরূপ, ইউজারনেম এবং পাসওয়ার্ড দিয়ে Authentication কনফিগার করতে নিচের কোডটি ব্যবহার করা যেতে পারে:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login", "/register").permitAll() // login এবং register পেজ কে পাবলিক রাখুন
.anyRequest().authenticated() // অন্যান্য পেজের জন্য authentication প্রয়োজন
.and()
.formLogin()
.loginPage("/login") // কাস্টম লগইন পেজ
.permitAll()
.and()
.logout()
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication() // ইন-মেমরি Authentication
.withUser("user").password(passwordEncoder().encode("password")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
কনফিগারেশন ব্যাখ্যা:
- authorizeRequests(): এটি HTTP রিকোয়েস্ট গুলিকে নির্দিষ্ট কনফিগারেশন অনুযায়ী অনুমতি দেয়। উদাহরণস্বরূপ,
/loginএবং/registerপেজগুলোকে সকলের জন্য খোলা রাখা হয়েছে, তবে অন্য পেজের জন্য Authentication প্রয়োজন। - formLogin(): এটি একটি কাস্টম লগইন পেজ সেট করে দেয় এবং লগইন প্রক্রিয়ায় নিরাপত্তা কনফিগার করে।
- inMemoryAuthentication(): এখানে ইন-মেমরি Authentication কনফিগার করা হয়েছে। এটি ডেমো অ্যাপ্লিকেশনে সিম্পল ইউজারনেম এবং পাসওয়ার্ড দিয়ে Authentication দেয়।
- passwordEncoder(): পাসওয়ার্ড এনকোডিংয়ের জন্য
BCryptPasswordEncoderব্যবহার করা হয়েছে।
৩. Custom Login Page তৈরি
আপনি যদি কাস্টম লগইন পেজ ব্যবহার করতে চান, তবে একটি সিম্পল HTML পেজ তৈরি করতে হবে, যেমন:
<!-- login.html -->
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h2>Login Page</h2>
<form action="/login" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username" required /><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required /><br><br>
<input type="submit" value="Login" />
</form>
</body>
</html>
Spring Security দিয়ে Authorization
Authorization কনফিগারেশন Spring Security-তে বিভিন্ন রোল এবং পারমিশন অনুযায়ী করা যায়। অর্থাৎ, আমরা নির্দিষ্ট ব্যবহারকারীদের বিভিন্ন অ্যাক্সেস অনুমতি দিতে পারি।
১. রোল এবং পারমিশন কনফিগারেশন
Spring Security এর মাধ্যমে বিভিন্ন রোল তৈরি করা হয় এবং রোলের ভিত্তিতে অ্যাক্সেস নিয়ন্ত্রণ করা হয়। নিচে রোল অনুযায়ী Authorization কনফিগার করার উদাহরণ দেওয়া হলো:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // ADMIN রোল ছাড়া অন্যরা অ্যাক্সেস পাবে না
.antMatchers("/user/**").hasRole("USER") // USER রোল ছাড়া অন্যরা অ্যাক্সেস পাবে না
.anyRequest().authenticated() // অন্যান্য সব রিকোয়েস্টের জন্য Authentication প্রয়োজন
.and()
.formLogin()
.permitAll()
.and()
.logout()
.permitAll();
}
}
২. Role-based Authentication
এটি দেখায় যে কিভাবে ভিন্ন রোলের উপর ভিত্তি করে ব্যবহারকারীদের ভিন্ন ভিন্ন অ্যাক্সেস দেওয়া হয়। উদাহরণস্বরূপ:
/admin/**পেজ শুধুমাত্র ADMIN রোলধারী ব্যবহারকারীরা অ্যাক্সেস করতে পারবে।/user/**পেজ শুধুমাত্র USER রোলধারী ব্যবহারকারীরা অ্যাক্সেস করতে পারবে।
৩. Custom Authentication Provider
Spring Security দিয়ে আপনি কাস্টম Authentication Provider ব্যবহার করতে পারেন যেখানে আপনি নিজের Authentication লজিক ইমপ্লিমেন্ট করতে পারবেন।
@Service
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = (String) authentication.getCredentials();
// কাস্টম Authentication Logic
if ("user".equals(username) && "password".equals(password)) {
return new UsernamePasswordAuthenticationToken(username, password, new ArrayList<>());
} else {
throw new BadCredentialsException("Invalid username or password");
}
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
সারাংশ
Spring Security দিয়ে Authentication এবং Authorization প্রক্রিয়া সহজভাবে কনফিগার করা যায়। Authentication প্রক্রিয়ায় ব্যবহারকারীর পরিচয় যাচাই করা হয় এবং Authorization এর মাধ্যমে বিভিন্ন রোলের উপর ভিত্তি করে অ্যাক্সেস নিয়ন্ত্রণ করা হয়। Spring Security এর WebSecurityConfigurerAdapter ব্যবহার করে আপনি কাস্টম Authentication এবং Authorization কনফিগারেশন করতে পারেন, যার ফলে আপনার অ্যাপ্লিকেশন নিরাপদ এবং নিরাপত্তা নীতি অনুযায়ী পরিচালিত হয়।
Read more