最近使用到OpenLDAP,需要集成進系統。但是OpenLDAP本身的模板中,能用的屬性太少了,無法滿足正常的業務需求,因此需要對條目的屬性進行擴展。
確定的思路是新增自定義的objectClass,條目的objectClass添加該objectClass之后就可以合法添加自定義屬性了(支持PhpLdapAdmin和ApacheDirectoryStudio等可視化工具)
但是能找到的相關的內容比較少,查到的比較多的也是直接添加schema然后在slapd.conf中引入。在服務器上試了一下(OpenLDAP版本號:2.4.44),沒起作用。所以去stackoverflow上取了取經。
1:服務器任意目錄創建新的schema文件,例如test.schema。
文件中的objectclass需要修改name,且必須確保每個項的oid全局唯一(oid的命名都有規律可循,但是我不知道的時候都是瞎編的- - )。
attributetype ( 1.3.6.1.4.1.42.2.27.4.1.98 NAME 'userCertNo' DESC 'userCertNo' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributetype ( 1.3.6.1.4.1.42.2.27.4.1.97 NAME 'userCertCN' DESC 'userCertCN' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) objectclass ( 1.3.6.1.4.1.42.2.27.4.2.88 NAME 'financeUser' DESC 'financeUser' SUP top AUXILIARY MAY ( cn $ userCertNo $ userCertCN ) )
2:創建編譯用的配置文件,例如test.conf。其中只需要包含自己創建的schema即可
include /etc/openldap/test/test.schema
3:以上兩個文件放在同級目錄下(也可以不放一起,編譯時指定即可),隨后創建目錄testdir用於存放編譯后的文件。
然后執行slaptest命令編譯自定義的schema,生成ldif等文件
slaptest -f test.conf -F testdir
4:進入testdir目錄下的cn=config/cn=schema目錄下可以看到生成的一個ldif文件。此時重命名該文件,並修改其中的cn和dn。(ldif文件中對空格等元素有嚴格要求,請不要額外添加空格等其他不必要的元素)
圖中標黃的內容表明的是你要創建的objectClass的類名。
5:文件名修改完成后在該目錄下執行slapadd命令,將該文件添加進OpenLdap庫
slapadd -l ebankUser.ldif -n 0
如下圖所示即為成功,需要注意是否有提示屬性重復或者oid重復,如果提示報錯需要修改schema后再次編譯。
較為常見的錯誤是提示你屬性重復或者oid重復,此時最好重新修改schema文件然后再次編譯。
6:以上步驟完成后可以在/etc/openldap/slapd.d/cn=config/cn=schema路徑下看到自己新添加的objectclass對應的ldif文件了。
7:文件賦權並重啟ldap服務。
直接重啟服務會報錯,需要給/etc/openldap/slapd.d/cn=config/cn=schema賦權或直接修改文件所有者為ldap,否則用戶ldap無法讀取。
chmod -R 777 cn=schema
然后重啟服務
Service slapd restart
8:通過可視化管理界面phpldapadmin或者ApacheDirectoryStudio連接,然后在已有的用戶上新增objectClass,選擇自定義添加的class即可。隨后便可以手動添加自定義的屬性值了。