Spring Security তে টেস্টিং একটি গুরুত্বপূর্ণ অংশ, কারণ এটি নিশ্চিত করতে সাহায্য করে যে নিরাপত্তা কনফিগারেশন সঠিকভাবে কাজ করছে। Spring Security টেস্টিং করার জন্য @WithMockUser এবং @WithUserDetails এনোটেশন দুটি গুরুত্বপূর্ণ সরঞ্জাম।
- @WithMockUser: এটি একটি কাস্টম ইউজার তৈরি করে যা Spring Security টেস্টিং কনটেক্সটে ব্যবহার করা হয়। এটি সাধারণত মক ইউজার তৈরি করতে ব্যবহৃত হয়, যা পাসওয়ার্ড, রোল এবং অনুমতিসমূহ সহ টেস্টিং কনফিগারেশনের জন্য ব্যবহার করা হয়।
- @WithUserDetails: এটি Spring Security-র মাধ্যমে ডাটাবেসে সংরক্ষিত ইউজার ডিটেইলস ব্যবহার করে টেস্টে ইউজার তৈরি করে। এটি
UserDetailsServiceথেকে ইউজারের তথ্য নিয়ে আসে এবং সেটি টেস্ট কেসে ব্যবহার করে।
ধাপ ১: Spring Security টেস্টিং কনফিগারেশন
প্রথমে, Spring Security টেস্টিং সমর্থন করার জন্য spring-boot-starter-test ডিপেন্ডেন্সি এবং spring-security-test ডিপেন্ডেন্সি যুক্ত করতে হবে।
pom.xml ডিপেন্ডেন্সি:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
ধাপ ২: @WithMockUser এনোটেশন
@WithMockUser এনোটেশন দিয়ে আপনি সহজেই একটি মক ইউজার তৈরি করতে পারেন। এটি কোন ইউজারের সাথে টেস্ট করতে চান তার জন্য প্রয়োজনীয় ইউজারনেম, রোল এবং পাসওয়ার্ড প্রদান করতে পারে। এটি Spring Security কনটেক্সটে ইউজারকে অস্থায়ীভাবে ইনজেক্ট করে।
উদাহরণ: @WithMockUser ব্যবহার
import org.junit.jupiter.api.Test;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.security.web.context.SecurityContextPersistenceFilter;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
public class SecurityTest {
private MockMvc mockMvc;
@Test
@WithMockUser(username = "admin", roles = "ADMIN")
public void testAccessSecuredEndpointWithAdmin() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(new MyController()).build();
mockMvc.perform(get("/admin"))
.andExpect(status().isOk()); // Expected status for admin role
}
@Test
@WithMockUser(username = "user", roles = "USER")
public void testAccessSecuredEndpointWithUser() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(new MyController()).build();
mockMvc.perform(get("/user"))
.andExpect(status().isOk()); // Expected status for user role
}
@Test
@WithMockUser(username = "guest", roles = "GUEST")
public void testAccessSecuredEndpointWithGuest() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(new MyController()).build();
mockMvc.perform(get("/guest"))
.andExpect(status().isForbidden()); // Forbidden for guest role
}
}
ব্যাখ্যা:
@WithMockUser(username = "admin", roles = "ADMIN"): এই এনোটেশনটি একটি মক ইউজার তৈরি করবে যার ইউজারনেমadminএবং রোলADMIN।testAccessSecuredEndpointWithAdmin():/adminএন্ডপয়েন্টের জন্য লগইন করে, এবংADMINরোল সহ ব্যবহৃত ইউজারটিকে200 OKস্ট্যাটাস প্রদান করা হয়।testAccessSecuredEndpointWithUser():/userএন্ডপয়েন্টে ইউজারের অ্যাক্সেস অনুমোদন করা হয়, যেখানে ইউজারের রোলUSER।testAccessSecuredEndpointWithGuest():/guestএন্ডপয়েন্টেGUESTরোলের জন্য অ্যাক্সেস নিষিদ্ধ (Forbidden) করা হয়।
ধাপ ৩: @WithUserDetails এনোটেশন
@WithUserDetails এনোটেশন ব্যবহার করে Spring Security বাস্তব ইউজার ডেটাবেসে সংরক্ষিত ইউজারদের সাথে টেস্ট করতে পারে। এটি UserDetailsService থেকে ডাটা নিয়ে ইউজার তৈরি করে।
উদাহরণ: @WithUserDetails ব্যবহার
import org.junit.jupiter.api.Test;
import org.springframework.security.test.context.support.WithUserDetails;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
public class SecurityTest {
private MockMvc mockMvc;
@Test
@WithUserDetails("admin") // UserDetailsService থেকে 'admin' ইউজার নিয়ে আসবে
public void testAccessSecuredEndpointWithAdminUserDetails() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(new MyController()).build();
mockMvc.perform(get("/admin"))
.andExpect(status().isOk()); // Expected status for admin role
}
@Test
@WithUserDetails("user") // UserDetailsService থেকে 'user' ইউজার নিয়ে আসবে
public void testAccessSecuredEndpointWithUserUserDetails() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(new MyController()).build();
mockMvc.perform(get("/user"))
.andExpect(status().isOk()); // Expected status for user role
}
}
ব্যাখ্যা:
@WithUserDetails("admin"): এটিUserDetailsServiceথেকেadminনামক ব্যবহারকারীকে লোড করে, এবং তার রোল, পাসওয়ার্ডসহ সঠিকভাবে টেস্টের কনটেক্সটে ইউজার ডেটা ইনজেক্ট করে।testAccessSecuredEndpointWithAdminUserDetails():/adminএন্ডপয়েন্টে ইউজারটির অ্যাক্সেস অনুমোদিত হবে, যেহেতুadminইউজারকেADMINরোল দেওয়া হয়েছে।testAccessSecuredEndpointWithUserUserDetails():/userএন্ডপয়েন্টেuserরোল সহ ইউজারের অ্যাক্সেস অনুমোদিত হবে।
ধাপ ৪: কাস্টম ইউজার ডিটেইলসের সাথে @WithUserDetails ব্যবহার
যদি আপনার প্রকল্পে একটি কাস্টম UserDetailsService থাকে, তবে @WithUserDetails ব্যবহার করতে হবে সেই কাস্টম ইউজার ডিটেইলস সার্ভিসের মাধ্যমে। এর জন্য আপনাকে @WithUserDetails এর সাথে সেই ইউজারের নাম বা UserDetailsService কনফিগার করতে হবে।
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Service;
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Override
public User loadUserByUsername(String username) throws UsernameNotFoundException {
if ("admin".equals(username)) {
return new User("admin", "password", AuthorityUtils.createAuthorityList("ROLE_ADMIN"));
} else if ("user".equals(username)) {
return new User("user", "password", AuthorityUtils.createAuthorityList("ROLE_USER"));
}
throw new UsernameNotFoundException("User not found");
}
}
এখন আপনি @WithUserDetails("admin") এনোটেশন ব্যবহার করলে এটি কাস্টম UserDetailsService থেকে ইউজারের ডিটেইলস লোড করবে।
উপসংহার
Spring Security তে @WithMockUser এবং @WithUserDetails দুটি শক্তিশালী এনোটেশন যা টেস্টিংয়ের জন্য ব্যবহৃত হয়:
- @WithMockUser: মক ইউজার তৈরি করতে ব্যবহৃত হয়, যেটি কোন ডাটাবেস ডিপেনডেন্ট নয়।
- @WithUserDetails: এটি বাস্তব ইউজারের ডিটেইলস লোড করতে ব্যবহৃত হয়, যা
UserDetailsServiceথেকে প্রাপ্ত হয় এবং ডাটাবেস ভিত্তিক ইউজার যাচাই করে।
এই দুটি এনোটেশন Spring Security কনফিগারেশনের অধীনে নিরাপত্তা টেস্টিং প্রক্রিয়া সহজতর করতে সহায়ক।
Read more