Spring Security এবং Passay সংযুক্ত করার মাধ্যমে আপনি Spring অ্যাপ্লিকেশনগুলিতে পাসওয়ার্ড নিরাপত্তা এবং পলিসি ব্যবস্থাপনাকে আরও শক্তিশালী করতে পারেন। Spring Security সাধারণত পাসওয়ার্ড যাচাইয়ের জন্য কাস্টম পাসওয়ার্ড ভ্যালিডেশন যুক্ত করার একটি সহজ উপায় প্রদান করে, এবং Passay এই কাজটি সহজে এবং নিরাপদভাবে করতে সহায়ক।
এখানে আমরা দেখব কীভাবে Spring Security এর সাথে Passay ব্যবহার করে কাস্টম পাসওয়ার্ড ভ্যালিডেশন যোগ করা যায়।
1. Maven Dependency যুক্ত করা
প্রথমে, আপনার Spring Boot প্রকল্পে Passay এবং Spring Security এর জন্য প্রয়োজনীয় ডিপেনডেন্সি যুক্ত করুন।
<dependency>
<groupId>org.passay</groupId>
<artifactId>passay</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. Passay Password Validation Configuration
Spring Security এর পাসওয়ার্ড যাচাই প্রক্রিয়ায় Passay ব্যবহার করতে, একটি কাস্টম পাসওয়ার্ড ভ্যালিডেটর তৈরি করতে হবে। এই ভ্যালিডেটরটি Passay এর PasswordValidator এবং Rule ব্যবহার করবে।
import org.passay.*;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Component
public class PassayPasswordValidator implements PasswordEncoder {
private final PasswordValidator passwordValidator;
public PassayPasswordValidator() {
passwordValidator = new PasswordValidator(Arrays.asList(
new LengthRule(8, 16), // পাসওয়ার্ডের দৈর্ঘ্য 8-16 অক্ষর
new UppercaseCharacterRule(1), // অন্তত একটি বড় হাতের অক্ষর
new DigitCharacterRule(1), // অন্তত একটি সংখ্যা
new SpecialCharacterRule(1), // অন্তত একটি স্পেশাল ক্যারেক্টার
new WhitespaceRule() // ফাঁকা স্থান নিষিদ্ধ
));
}
@Override
public String encode(CharSequence rawPassword) {
// এখানে Passay এর password validation করা হবে
RuleResult result = passwordValidator.validate(new PasswordData(rawPassword.toString()));
if (result.isValid()) {
// পাসওয়ার্ড বৈধ হলে এটিকে এনকোড করুন
return rawPassword.toString(); // এই উদাহরণে আমরা সরাসরি পাসওয়ার্ড ফিরিয়ে দিচ্ছি (প্রকৃত অ্যাপ্লিকেশনে এনকোডিং করতে হবে)
} else {
// পাসওয়ার্ড অবৈধ হলে ত্রুটির বার্তা পাঠান
throw new IllegalArgumentException("পাসওয়ার্ড অবৈধ। কারণ: " + passwordValidator.getMessages(result));
}
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
// সাধারণত পাসওয়ার্ড ম্যাচিংয়ের জন্য এনকোডেড পাসওয়ার্ড চেক করুন
return rawPassword.toString().equals(encodedPassword);
}
}
3. Spring Security Configuration
এখন Spring Security কনফিগারেশন ফাইল তৈরি করতে হবে, যেখানে PassayPasswordValidator ব্যবহার করা হবে। এতে আপনার পাসওয়ার্ড যাচাইয়ের জন্য Passay এর কাস্টম ভ্যালিডেটর সংযুক্ত হবে।
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 {
private final PassayPasswordValidator passayPasswordValidator;
public SecurityConfig(PassayPasswordValidator passayPasswordValidator) {
this.passayPasswordValidator = passayPasswordValidator;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login", "/signup").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Override
@Bean
public UserDetailsService userDetailsService() {
return username -> User.builder()
.username(username)
.password(passayPasswordValidator.encode("Test@1234")) // এখানে পাসওয়ার্ড ভ্যালিডেশন
.roles("USER")
.build();
}
@Override
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // বাস্তব এনকোডিং জন্য BCrypt
}
}
4. Custom Sign Up Controller
এখন, আপনি যদি একটি সাইন আপ ফর্ম তৈরি করেন যেখানে ব্যবহারকারীরা তাদের পাসওয়ার্ড নিবন্ধন করতে পারবেন, তখন সাইন আপ প্রসেসের সময় PassayPasswordValidator ব্যবহার হবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class SignUpController {
@Autowired
private PassayPasswordValidator passayPasswordValidator;
@GetMapping("/signup")
public String showSignUpForm() {
return "signup";
}
@PostMapping("/signup")
public String signUp(@RequestParam("password") String password, Model model) {
try {
passayPasswordValidator.encode(password); // পাসওয়ার্ড যাচাই করুন
model.addAttribute("message", "পাসওয়ার্ড সফলভাবে নিবন্ধিত হয়েছে!");
return "signup-success";
} catch (IllegalArgumentException e) {
model.addAttribute("error", e.getMessage());
return "signup";
}
}
}
5. HTML Forms
Signup Form (signup.html):
<form action="/signup" method="post">
<label for="password">পাসওয়ার্ড:</label>
<input type="password" id="password" name="password" required>
<button type="submit">নিবন্ধন করুন</button>
</form>
Signup Success Page (signup-success.html):
<h1>পাসওয়ার্ড সফলভাবে নিবন্ধিত হয়েছে!</h1>
উপসংহার:
এই উদাহরণে, আমরা দেখেছি কীভাবে Passay এবং Spring Security একত্রে ব্যবহার করে কাস্টম পাসওয়ার্ড ভ্যালিডেশন যুক্ত করা যায়। Spring Security ব্যবহারকারীর পাসওয়ার্ড যাচাইয়ের জন্য Passay এর কাস্টম রুল ব্যবহার করার মাধ্যমে আপনার সিস্টেমে শক্তিশালী পাসওয়ার্ড পলিসি প্রয়োগ করা সম্ভব।