1. 程式人生 > >LDAP基礎:2:使用Java驗證OpenLdap使用者登入

LDAP基礎:2:使用Java驗證OpenLdap使用者登入

這篇文章整理一下如何使用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之類功能的整合。