springboot操作ldap全過程
以下可能不是特別深入講解,只是開發(fā)用到,淺談一下。盡量用數(shù)據(jù)庫的方式去對應
LDAP:輕量級目錄訪問協(xié)議。
微軟的AD域,openldap之類的都可以通過LDAP協(xié)議去連接訪問。
ad(active diretory)活動目錄;openldap就是ldap協(xié)議的具體實現(xiàn)。
在這里把他們當成一個數(shù)據(jù)庫來看待,目錄存儲數(shù)據(jù)庫。
如下圖,就是openldap的層級圖。
1. 專有名詞
關于這一塊涉及到很多專有名詞這里簡單談一下。
- dc:表示域名的意思,就是一個域的名稱,可以當成數(shù)據(jù)庫中的庫名來看待。
- ou:組織單元,就像一層層的文件夾看待,這個ou可以有多個層級,就是ou下還可以有ou,當成數(shù)據(jù)庫中的表看待
- cn:用戶名或服務器名。就相當于數(shù)據(jù)庫某一行用戶信息的主鍵
- dn:相當于絕對路徑,由cn+ou+dc組成。如上圖alice的dn就是 cn=alice,ou=school,dc=demo,dc=com
每個用戶是有多個屬性值的,就好比數(shù)據(jù)庫中的字段,一行用戶有多個字段信息
2. springboot連接
導入依賴
<!--ldap--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-ldap</artifactId> </dependency>
application.properties配置文件。這里連接的賬戶不是ldap目錄下管理的用戶,就是別用上述的alice這種用戶去連接。
#AD認證 spring.ldap.urls=ldap://127.0.0.1:389 spring.ldap.username=cn=admin,dc=demo,dc=com spring.ldap.password=123456 spring.ldap.base=ou=school,dc=demo,dc=com
自定義配置類
@Configuration public class LdapConfig { @Value("${spring.ldap.urls}") private String ldapUrl; @Value("${spring.ldap.username}") private String userName; @Value("${spring.ldap.password}") private String password; @Bean public LdapContextSource ldapContextSource() { LdapContextSource source = new LdapContextSource(); source.setUrl(ldapUrl); source.setUserDn(userName); source.setPassword(password); return source; } @Bean public LdapTemplate ldapTemplate() { return new LdapTemplate(ldapContextSource()); } }
基本上如上配置就可以操作了
測試是否可以連接,直接調用接口,能成功連接就會輸出數(shù)據(jù),無法連接會出現(xiàn)認證異常。
3. 按條件查詢
先上案例,查詢cn屬性值為alice的。這里沒有指定返回的屬性有哪些,所以返回的就是所有屬性。稍后再解釋Person和PersonMapper
Person就是一個普通實體類,就像平時查詢數(shù)據(jù)庫數(shù)據(jù)時都是用實體類接收數(shù)據(jù)
@Data public class Person { private String cn; private String displayName; private String givenName; private String eMail; private String ou; }
PersonMapper類就不一樣了,必須繼承AttributesMapper類,實現(xiàn)mapFromAttributes方法。
當ldapTemplate通過條件篩選出數(shù)據(jù)時,一行數(shù)據(jù)就會調用一次這個方法,attributes帶有查出的屬性值
@Slf4j public class PersonMapper implements AttributesMapper<Person> { @Override public Person mapFromAttributes(Attributes attributes) throws NamingException { log.info(attributes.toString()); Person result = new Person(); result.setCn(attributes.get("cn").get().toString()); return result; } }
篩選方式有很多,必須有篩選條件才能查詢。
加上attributes(new String[]{"cn", "mail"}),就只會查詢出這兩個屬性值
LdapQuery query = LdapQueryBuilder.query() .base(base) .searchScope(SearchScope.SUBTREE) .attributes(new String[]{"cn", "mail"}) .where("cn") .is("alice");
可以用filter篩選,也是cn屬性值為alice的篩選條件。
LdapQuery query = LdapQueryBuilder.query() .base(base) .searchScope(SearchScope.SUBTREE) .filter("(cn=alice)");
base下所有內容帶有objectClass屬性,都會被查出來。
如果base自身也帶有,自身也會被查出來
LdapQuery query = LdapQueryBuilder.query() .base(base) .searchScope(SearchScope.SUBTREE) .filter("(objectClass=*)");
多條件篩選,cn為alice并且mail為123@qq.com的內容。
LdapQuery query = LdapQueryBuilder.query() .base(base) .searchScope(SearchScope.SUBTREE) .filter("(&(cn=alice)(mail=123@qq.com))");
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Intellij IDEA命令行執(zhí)行java無法加載主類解決方案
這篇文章主要介紹了Intellij IDEA命令行執(zhí)行java無法加載主類解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09mybatis創(chuàng)建項目報Invalid?bound?statement?(not?found)錯誤解決方法
使用MyBatis能夠幫助我們將SQL語句和Java代碼分離,這篇文章主要給大家介紹了關于mybatis創(chuàng)建項目報Invalid?bound?statement?(not?found)錯誤的解決方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-05-05SpringBoot實現(xiàn)短信驗證碼校驗方法思路詳解
最近做項目遇到這樣的需求,前端是基于BootStrap,html代碼中有BootStrap樣式實現(xiàn)的,具體后臺實現(xiàn)代碼大家通過本文一起學習吧2017-08-08MyEclipse+Tomcat+MAVEN+SVN項目完整環(huán)境搭建(圖文教程)
這篇文章主要介紹了MyEclipse+Tomcat+MAVEN+SVN項目完整環(huán)境搭建(圖文教程),非常具有實用價值,需要的朋友可以參考下2017-12-12Java實現(xiàn)中文字符串與unicode互轉工具類
這篇文章主要為大家詳細介紹了Java實現(xiàn)中文字符串與unicode互轉的工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04詳解mybatis-plus使用@EnumValue注解的方式對枚舉類型的處理
這篇文章主要介紹了詳解mybatis-plus使用@EnumValue注解的方式對枚舉類型的處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12MyEclipse2018中安裝Mybatis generator插件的實現(xiàn)步驟
這篇文章主要介紹了MyEclipse2018中安裝Mybatis generator插件的實現(xiàn)步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02