Ringkasan LDAP Musim Semi

1. Ikhtisar

Server direktori LDAP adalah penyimpanan data hierarki yang dioptimalkan untuk membaca. Biasanya, mereka digunakan untuk menyimpan informasi terkait pengguna yang diperlukan untuk otentikasi dan otorisasi pengguna.

Dalam artikel ini, kita akan menjelajahi Spring LDAP API untuk mengautentikasi dan menelusuri pengguna, serta membuat dan mengubah pengguna di server direktori. Kumpulan API yang sama dapat digunakan untuk mengelola jenis entri lainnya di LDAP.

2. Ketergantungan Maven

Mari kita mulai dengan menambahkan dependensi Maven yang diperlukan:

 org.springframework.ldap spring-ldap-core 2.3.1.RELEASE 

Versi terbaru dari ketergantungan ini dapat ditemukan di spring-ldap-core.

3. Persiapan Data

Untuk keperluan artikel ini, pertama-tama mari buat entri LDAP berikut:

ou=users,dc=example,dc=com (objectClass=organizationalUnit)

Di bawah node ini, kami akan membuat pengguna baru, memodifikasi pengguna yang ada, mengotentikasi pengguna yang ada dan mencari informasi.

4. API LDAP Musim Semi

4.1. Definisi ContextSource & LdapTemplate Bean

ContextSource digunakan untuk membuat LdapTemplate . Kita akan melihat penggunaan ContextSource selama otentikasi pengguna di bagian selanjutnya:

@Bean public LdapContextSource contextSource() { LdapContextSource contextSource = new LdapContextSource(); contextSource.setUrl(env.getRequiredProperty("ldap.url")); contextSource.setBase( env.getRequiredProperty("ldap.partitionSuffix")); contextSource.setUserDn( env.getRequiredProperty("ldap.principal")); contextSource.setPassword( env.getRequiredProperty("ldap.password")); return contextSource; }

LdapTemplate digunakan untuk pembuatan dan modifikasi entri LDAP:

@Bean public LdapTemplate ldapTemplate() { return new LdapTemplate(contextSource()); }

4.2. Otentikasi Pengguna

Sekarang mari mengimplementasikan logika sederhana untuk mengautentikasi pengguna yang sudah ada:

public void authenticate(String username, String password) { contextSource .getContext( "cn=" + username + ",ou=users," + env.getRequiredProperty("ldap.partitionSuffix"), password); }

4.3. Kreasi Pengguna

Selanjutnya, mari buat pengguna baru dan simpan hash SHA sandi di LDAP.

Pada saat otentikasi, server LDAP membuat hash SHA dari kata sandi yang diberikan dan membandingkannya dengan yang disimpan:

public void create(String username, String password) { Name dn = LdapNameBuilder .newInstance() .add("ou", "users") .add("cn", username) .build(); DirContextAdapter context = new DirContextAdapter(dn); context.setAttributeValues( "objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" }); context.setAttributeValue("cn", username); context.setAttributeValue("sn", username); context.setAttributeValue ("userPassword", digestSHA(password)); ldapTemplate.bind(context); }

digestSHA () adalah metode kustom yang mengembalikan string berenkode Base64 dari hash SHA dari sandi yang diberikan.

Terakhir, metode bind () dari LdapTemplate digunakan untuk membuat entri di server LDAP.

4.4. Modifikasi Pengguna

Kita dapat mengubah pengguna atau entri yang sudah ada dengan metode berikut:

public void modify(String username, String password) { Name dn = LdapNameBuilder.newInstance() .add("ou", "users") .add("cn", username) .build(); DirContextOperations context = ldapTemplate.lookupContext(dn); context.setAttributeValues ("objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" }); context.setAttributeValue("cn", username); context.setAttributeValue("sn", username); context.setAttributeValue("userPassword", digestSHA(password)); ldapTemplate.modifyAttributes(context); }

Metode lookupContext () digunakan untuk menemukan pengguna yang disediakan.

4.5. Pencarian Pengguna

Kami dapat mencari pengguna yang ada menggunakan filter pencarian:

public List search(String username) { return ldapTemplate .search( "ou=users", "cn=" + username, (AttributesMapper) attrs -> (String) attrs.get("cn").get()); }

The AttributesMapper digunakan untuk mendapatkan nilai atribut yang diinginkan dari entri ditemukan. Secara internal, Spring LdapTemplate memanggil AttributesMapper untuk semua entri yang ditemukan dan membuat daftar nilai atribut.

5. Pengujian

spring-ldap-test menyediakan server LDAP tertanam berdasarkan ApacheDS 1.5.5. Untuk menyiapkan server LDAP tertanam untuk pengujian, kita perlu mengkonfigurasi kacang Spring berikut:

@Bean public TestContextSourceFactoryBean testContextSource() { TestContextSourceFactoryBean contextSource = new TestContextSourceFactoryBean(); contextSource.setDefaultPartitionName( env.getRequiredProperty("ldap.partition")); contextSource.setDefaultPartitionSuffix( env.getRequiredProperty("ldap.partitionSuffix")); contextSource.setPrincipal( env.getRequiredProperty("ldap.principal")); contextSource.setPassword( env.getRequiredProperty("ldap.password")); contextSource.setLdifFile( resourceLoader.getResource( env.getRequiredProperty("ldap.ldiffile"))); contextSource.setPort( Integer.valueOf( env.getRequiredProperty("ldap.port"))); return contextSource; }

Mari kita uji metode pencarian pengguna kita dengan JUnit:

@Test public void givenLdapClient_whenCorrectSearchFilter_thenEntriesReturned() { List users = ldapClient .search(SEARCH_STRING); assertThat(users, Matchers.containsInAnyOrder(USER2, USER3)); }

6. Kesimpulan

Pada artikel ini, kami telah memperkenalkan Spring LDAP API dan mengembangkan metode sederhana untuk otentikasi pengguna, pencarian pengguna, pembuatan dan modifikasi pengguna di server LDAP.

Seperti biasa, kode sumber lengkap tersedia di proyek Github ini. Tes dibuat di bawah profil Maven "live" dan karenanya dapat dijalankan menggunakan opsi "-P live".