Introduction
做LDAP認證系統整合時,一定會遇到處理登入帳號的問題。有的系統會讓使用者定義user filter,僅僅輸入uid或mail即可登入;有的系統則是要求完整的DN。僅輸入uid或mail讓使用者不需要記住完整的DN,但有可能在不同OU下,會有重複的uid。我們系統是兩種方式都允許的,也因此我們必須先針對使用者輸入,去確認為DN或者user filter方式。
How to?
判斷使用者輸入是否為DN,可以透過JNDI的LdapName。其實spring有提供DistinguishedName類別,但在2.0版本已被列為@deprecated,並推薦使用javax.naming.ldap.LdapName。
Is a valid DN?
在LdapName建構時,如果不是一個合法的DN格式,就會丟出InvalidNameException;因此我們可以透過這個方式判斷是否為合法格式的DN:
@Test public void testValidDN(){ try { new LdapName("uid = tonylin,dc=tonylin,dc=org"); } catch (InvalidNameException e) { Assert.fail("Should pass"); } } @Test public void testinValidDN(){ try { new LdapName("tonylin@tonylin.org"); Assert.fail("Should throw exception"); } catch (InvalidNameException e) { } }
Does DN contains DC?
我們不會要求使用者一定要輸入完整的DN。但如果使用者輸入完整的DN,在做搜尋時,我們就必須將DC部分給取代掉。因此,我們可以透過LdapName的startsWith去判斷DN是否包含DC,又可以不需要去管等號前後是否有空白的問題:
@Test public void testLdapName(){ try { LdapName dn = new LdapName("uid = tonylin,dc=tonylin,dc=org"); Assert.assertTrue(dn.startsWith(new LdapName("dc =tonylin,dc=org"))); Assert.assertFalse(dn.startsWith(new LdapName("dc =tonylin,dc=com"))); } catch (InvalidNameException e) { Assert.fail(); } }
Remove DC
LdapName提供remove,讓你可以針對index去移除DN中的項目:
@Test public void removeDC(){ try { LdapName dn = new LdapName("uid = tonylin,dc=tonylin,dc=org"); dn.remove(0); Assert.assertTrue(dn.equals(new LdapName("uid=tonylin,dc=tonylin"))); dn.remove(0); Assert.assertTrue(dn.equals(new LdapName("uid=tonylin"))); } catch (InvalidNameException e) { Assert.fail(); } }
另外一個方式是直接取得Suffix。你可以根據DC的大小去決定Suffix的位置:
@Test public void getSuffix(){ try { LdapName dn = new LdapName("uid = tonylin,dc=tonylin,dc=org"); Assert.assertTrue(dn.getSuffix(2) .equals(new LdapName("uid=tonylin"))); } catch (InvalidNameException e) { Assert.fail(); } }
留言
張貼留言