স্প্রিং বুটের সাথে LDAP সেকুরিটি কনফিগার করা

integration-testldapsecurityspring-boottest

অনেক অরগানিজেশন আছে যারা ইন্টারনাল টুলের সিকুরিটির জন্য LDAP বা একটিভ ডিরেক্টরি সিকুরিটি ব্যাবহার করে থাকেন। স্প্রিং বুটের সাথে LDAP কনফিগার করা খুবই সহজ।


- নিচের মত করে ডিপেন্ডেন্সি যুক্ত করুন

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-ldap</artifactId>
</dependency>


এবং টেস্টের জন্য

<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>


প্রপারটিজ ফাইলে

ldap.serverurl=ldap://<ladap-server-url>:389/DC=<DC>,DC=<DC>
ldap.manager.dn=CN=<CN>,OU=<OU>,OU=<OU>,DC=<DC>,DC=<DC>
ldap.manager.password=<ldap-server-password>


ওয়েব সেকিউরিটি ফাইল@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${ldap.serverurl}")
    private String serverUrl;

    @Value("${ldap.manager.dn}")
    private String managerDn;

    @Value("${ldap.manager.password}")
    private String managerPassword;

   
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers(HttpMethod.POST, "/api/**")
                    .hasAuthority(<ROLE-OF_USER>)
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .defaultSuccessUrl("/admin/home")
        ;
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.ldapAuthentication()
                .contextSource()
                .url(serverUrl)
                .managerDn(managerDn)
                .managerPassword(managerPassword)
                .and()
                .userSearchBase("ou=<ou>")
                .userSearchFilter("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0}))")
                .groupSearchBase("OU=<OU>,OU=<OU>")
                .groupSearchFilter("(&(objectClass=group)(member={0}))")
        ;
    }

  }


শেষ। আপনার সার্ভার LDAP সেকিউরিটি দ্বরা সুরক্ষিত।


ইনটিগ্রেশন টেস্ট

যেহেতু LDAP সেশন দিয়ে সিকুরিটি মেইনটেইন করে, তাই প্রথম ইউজার এর পাসোয়ার্ড থেকে সেশন বের করে ফেলতে হবে, তারপর প্রতিটা ইনটিগ্রেশন টেস্টের সাথে সেই সেশন যুক্ত করে দিলেই কাজ হয়ে যাবে। প্রথমে দেখে নেয়া যাক কিভাবে সেশন বের করা যাযইউজার এর পাসোয়ার্ড থেকে। আমি ইনটিগ্রেশন টেস্টের জন্য সবসময় একটা বেস ক্লাস লিখে ফেলি তারপর সেটাকে এক্সটেন্ড করে কাজ করি।

@SpringBootTest
@WebAppConfiguration
@RunWith(SpringRunner.class)
public abstract class AbstractIntegrationTest {

    @Autowired
    private WebApplicationContext applicationContext;

    @Autowired
    public ObjectMapper objectMapper;

    public MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        this.mockMvc = MockMvcBuilders
                .webAppContextSetup(this.applicationContext)
                .apply(springSecurity())
                .alwaysDo(print())
                .build();
    }

    public MockHttpSession getSession() throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        ResultActions result = this.mockMvc.perform(post("/login")
                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                .accept(MediaType.APPLICATION_JSON_UTF8)
                .param("username", AuthHelper.username)
                .param("password", AuthHelper.password))
                .andExpect(status().is3xxRedirection());
        return (MockHttpSession)result.andReturn().getRequest().getSession();
    }
}



ইউজার নেম চেক করার ইনটিগ্রেশন টেস্ট

@ActiveProfiles("it")
public class MeApiIT  extends AbstractIntegrationTest {

    @Test
    public void getMe() throws Exception {
        this.mockMvc.perform(
                get("/api/users/me")
                        .session(getSession())
        )
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.userName").value("maruf.hassan"));
    }

}


বাকি সব সিকিউর এপিয়াই একই ভাবে টেস্ট করা যাবে। ধন্যবাদ