LDAP基礎:2:使用Java驗證OpenLdap使用者登入
阿新 • • 發佈:2018-11-10
這篇文章整理一下如何使用Java進行OpenLdap使用者登陸驗證。
事前準備
有自己的Ldap伺服器或者使用OpenLdap搭建一個簡單的伺服器,可以參看:
Java相關的類
在java中主要使用javax.naming來進行驗證,驗證過程中會使用到:
- javax.naming.Context;
- javax.naming.directory.DirContext;
- javax.naming.directory.InitialDirContext;
程式碼示例
這裡給出最簡單的程式碼驗證示例
[[email protected] ~]# cat LdapDemo.java
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
public class LdapDemo{
public static void main(String[] args){
System.out.println("IPAdress: " + args[0]);
System.out.println("Username: " + args[1]);
System.out.println("Password: " + args[2]);
Hashtable<String, String> tbl = new Hashtable<String, String>(4);
String LDAP_URL = "ldap://" +args[0]+ "/dc=example,dc=org";
tbl.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
tbl.put(Context.PROVIDER_URL, LDAP_URL);
tbl.put(Context.SECURITY_AUTHENTICATION, "simple");
tbl.put(Context.SECURITY_PRINCIPAL, args[1]);
tbl.put(Context.SECURITY_CREDENTIALS, args[2]);
System.out.println("env setting");
DirContext context = null;
try {
System.out.println("login verification begins...");
context = new InitialDirContext(tbl);
System.out.println("login successfully.");
} catch (Exception ex) {
System.out.println("login failed.");
} finally {
try {
if (context != null) {
context.close();
context = null;
}
tbl.clear();
} catch (Exception e) {
System.out.println("exception happened.");
}
}
}
}
[ [email protected] ~]#
驗證
事前準備:需要準備如下環境,這裡從宿主機訪問容器中執行的OpenLdap服務,本文相關資訊如下:
- Ldap使用的IP: 172.17.0.3
- 使用者名稱:cn=admin,dc=example,dc=org
- 使用者密碼:admin
[[email protected] ~]# ldapsearch -x -H ldap://172.17.0.3 -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# example.org
dn: dc=example,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: Example Inc.
dc: example
# admin, example.org
dn: cn=admin,dc=example,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9RTBJMTlqaW1BTVlaZ0h2aEhPbm5YVVdWRmQxaEtBRnM=
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
[ [email protected] ~]#
結果確認
成功登陸用例
[[email protected] ~]# javac LdapDemo.java
[[email protected] ~]# java LdapDemo "172.17.0.3" "cn=admin,dc=example,dc=org" "admin"
IPAdress: 172.17.0.3
Username: cn=admin,dc=example,dc=org
Password: admin
env setting
login verification begins...
login successfully.
[[email protected] ~]#
失敗登陸用例
使用錯誤的使用者密碼,結果顯示無法登陸
[[email protected] ~]# javac LdapDemo.java
[[email protected] ~]# java LdapDemo "172.17.0.3" "cn=admin,dc=example,dc=org" "admin1"
IPAdress: 172.17.0.3
Username: cn=admin,dc=example,dc=org
Password: admin1
env setting
login verification begins...
login failed.
[[email protected] ~]#
總結
Java中使用javax.naming可以對Ldap使用者資訊進行驗證,使用這點可以完成SSO之類功能的整合。