Gambaran Keseluruhan Spring LDAP

1. Gambaran keseluruhan

Pelayan direktori LDAP adalah simpanan data hierarki yang dioptimumkan untuk membaca. Biasanya, ia digunakan untuk menyimpan maklumat berkaitan pengguna yang diperlukan untuk pengesahan dan kebenaran pengguna.

Dalam artikel ini, kami akan meneroka Spring LDAP API untuk mengesahkan dan mencari pengguna, serta membuat dan mengubah pengguna di pelayan direktori. Set API yang sama dapat digunakan untuk menguruskan jenis entri lain di LDAP.

2. Pergantungan Maven

Mari mulakan dengan menambahkan kebergantungan Maven yang diperlukan:

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

Versi terbaru dari ketergantungan ini boleh didapati di spring-ldap-core.

3. Penyediaan Data

Untuk tujuan artikel ini, mari kita buat entri LDAP berikut:

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

Di bawah simpul ini, kami akan membuat pengguna baru, mengubah pengguna yang ada, mengesahkan pengguna yang ada dan mencari maklumat.

4. API LDAP musim bunga

4.1. ContextSource & LdapTemplate Bean Definition

ContextSource digunakan untuk membuat LdapTemplate . Kami akan melihat penggunaan ContextSource semasa pengesahan pengguna di bahagian seterusnya:

@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 pengubahsuaian entri LDAP:

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

4.2. Pengesahan Pengguna

Sekarang mari kita laksanakan logik sederhana untuk mengesahkan pengguna yang ada:

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

4.3. Penciptaan Pengguna

Seterusnya, mari buat pengguna baru dan simpan hash SHA kata laluan di LDAP.

Pada masa pengesahan, pelayan LDAP menghasilkan hash SHA kata laluan yang dibekalkan dan membandingkannya dengan kata laluan 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 kaedah khusus yang mengembalikan rentetan dikodkan Base64 dari hash SHA kata laluan yang disediakan.

Akhirnya, mengikat () kaedah LdapTemplate digunakan untuk membuat catatan dalam pelayan LDAP.

4.4. Pengubahsuaian Pengguna

Kita dapat mengubah pengguna atau entri yang ada dengan kaedah 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); }

Kaedah lookupContext () digunakan untuk mencari pengguna yang dibekalkan.

4.5. Carian Pengguna

Kita boleh mencari pengguna yang ada menggunakan penapis carian:

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 dikehendaki daripada entri found. Secara dalaman, Spring LdapTemplate memanggil AttributMapper untuk semua entri yang dijumpai dan membuat senarai nilai atribut.

5. Menguji

spring-ldap-test menyediakan pelayan LDAP terbenam berdasarkan ApacheDS 1.5.5. Untuk menyediakan pelayan LDAP yang tersemat untuk diuji, kita perlu mengkonfigurasi kacang kacang 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 uji kaedah carian pengguna kami dengan JUnit:

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

6. Kesimpulannya

Dalam artikel ini, kami telah memperkenalkan Spring LDAP API dan mengembangkan kaedah mudah untuk pengesahan pengguna, carian pengguna, pembuatan pengguna dan pengubahsuaian dalam pelayan LDAP.

Seperti biasa kod sumber lengkap terdapat dalam projek Github ini. Ujian dibuat di bawah profil Maven "live" dan oleh itu boleh dijalankan menggunakan pilihan "-P live"