ldap查询、鉴权

package cn.richinfo.ldap;

import java.util.Iterator;

import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPSearchResults;

public class LdapSearch {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        //String ldapHost = "116.62.8.139";// ldap服务器
        String ldapHost = "192.168.34.97";
        int ldapPort = LDAPConnection.DEFAULT_PORT;// ldap端口
        String loginDN = "cn=Directory Manager,o=h3gat";// rootdn(slapd.conf的rootdn属性)
        String password = "123456";// rootpw(slapd.conf的rootpw属性)
        String searchBase = "o=h3gat";// suffix(slapd.conf的suffix属性)
        int searchScope = LDAPConnection.SCOPE_SUB;// 查询范围
        String searchFilter = "objectClass=*";//查询zteperson所有用户
        //String searchFilter = "(&(|(|([email protected])([email protected]))(|([email protected])([email protected])))(blocked=0))";// filter

        LDAPConnection lc = new LDAPConnection();
        try {
            lc.connect(ldapHost, ldapPort);
            lc.bind(LDAPConnection.LDAP_V3, loginDN, password.getBytes("UTF8"));
            System.out.println("Bind success.");
            LDAPSearchResults searchResults = lc.search(searchBase, searchScope, searchFilter, null, false);
            System.out.println("Result = " + searchResults.getCount());
            while (searchResults.hasMore()) {
                LDAPEntry nextEntry = null;
                try {
                    nextEntry = searchResults.next();
                } catch (LDAPException e) {
                    System.out.println("Error: " + e.toString());
                    if (e.getResultCode() == LDAPException.LDAP_TIMEOUT || e.getResultCode() == LDAPException.CONNECT_ERROR) {
                        break;
                    } else {
                        continue;
                    }
                }
                System.out.println("DN = " + nextEntry.getDN());
                System.out.println("\tAttributes list:");
                LDAPAttributeSet attributeSet = nextEntry.getAttributeSet();
                Iterator<LDAPAttribute> allAttributes = attributeSet.iterator();
                while (allAttributes.hasNext()) {
                    LDAPAttribute attribute = allAttributes.next();
                    System.out.println("\t\t" + attribute.getName() + " = " + attribute.getStringValue());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (lc.isConnected()) {
                    lc.disconnect();
                    System.out.println("Unbind success.");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
package cn.richinfo.ldap;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

public class LdapAuthentication {

    private LdapContext ctx = null;
    private final Control[] connCtls = null;

    private void execute() {
        Hashtable<String, String> env = new Hashtable<String, String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");// 不用改
        env.put(Context.PROVIDER_URL, "ldap://116.62.8.139:389/");// ldap服务器
        env.put(Context.SECURITY_AUTHENTICATION, "simple");// 不用改
        env.put(Context.SECURITY_CREDENTIALS, "123456");// rootpw(slapd.conf的rootpw属性)
        env.put(Context.SECURITY_PRINCIPAL, "cn=Directory Manager,o=h3gat"); // rootdn(slapd.conf的rootdn属性)

        try {
            ctx = new InitialLdapContext(env, connCtls);
            System.out.println("Bind success.");
            String suffix = "o=h3gat";// suffix(slapd.conf的suffix属性)
            String filter = "(|([email protected])([email protected]))";// 要鉴权的用户
            String password = "83B34499282F00DFDB908238435026C2";// //要鉴权的用户密码
            authenricate(suffix, filter, password);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ctx != null) {
                try {
                    ctx.close();
                    System.out.println("Unbind success.");
                } catch (NamingException e) {
                    e.printStackTrace();
                }

            }
        }
    }

    public static void main(String[] args) {
        LdapAuthentication ldap = new LdapAuthentication();
        ldap.execute();
    }

    private String getUserDN(String suffix, String filter) {
        String userDN = "";
        try {
            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
            NamingEnumeration<SearchResult> en = ctx.search(suffix, filter, constraints);
            if (en == null || !en.hasMoreElements()) {
                System.out.println("未找到该用户");
            }
            while (en.hasMoreElements()) {
                SearchResult result = en.nextElement();
                System.out.println(result.getNameInNamespace());
                userDN = result.getNameInNamespace();
            }
        } catch (Exception e) {
            System.out.println("查找用户时产生异常。");
            e.printStackTrace();
        }

        return userDN;
    }

    public boolean authenricate(String suffix, String filter, String password) {
        boolean valide = false;
        try {
            String userDN = getUserDN(suffix, filter);
            ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
            ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
            ctx.reconnect(connCtls);
            System.out.println("Authenricate success.");
            valide = true;
        } catch (Exception e) {
            e.printStackTrace();
            valide = false;
        }
        return valide;
    }

}
时间: 2024-10-15 00:26:20

ldap查询、鉴权的相关文章

【JMeter连接SQLServer】采用window鉴权方式连接(原创)

大家都知道Jmeter可以连接各种数据库,这方面我也不多说了,如果你还不知道怎么连接的话,可以参看我看的另外一篇博文,这边有详细的介绍 http://blog.csdn.net/lzqinfen/article/details/38730259 回归正题,由于公司测试环境的问题,我在连接SQLServer时,公司只能使用window方式的鉴权(通过我们的域账号验证),这下就变得麻烦了,因为本来按照普通的sqlServer连接,是很简单的如下图一样: 但现在采用window鉴权的方式,你无法再填写

CDH Sentry 管理Hive鉴权

在CM管理界面上要开启一些选项,这里不做详细说明,网上一查都有,推荐文章http://www.jianshu.com/p/055c40dcb8c5 但仅限于看配置的内容,至于下面的,作者没有详细解释 sentry的权限设置是在hive sql中完成的,需要用Beeline登录,如beeline -u jdbc:hive2://hiveIP:10000 -n user -p passwd 用户名密码属于hive所在的OS服务器,也就是说你要在hiveserver2上建立一个用户并且设置密码才可以登

HTTP基本认证和JWT鉴权

一.HTTP基本认证 Basic Authentication--当浏览器访问使用基本认证的网站的时候, 浏览器会提示你输入用户名和密码. http auth的过程: · 客户端发送http请求 · 服务器发现配置了http auth,于是检查request里面有没有"Authorization"的http header · 如果有,则判断Authorization里面的内容是否在用户列表里面,Authorization header的典型数据为"Authorization:

Golang Gin/Ace/Iris/Echo RBAC 鉴权库

GRBAC 项目地址: https://github.com/storyicon/grbac Grbac是一个快速,优雅和简洁的RBAC框架.它支持增强的通配符并使用Radix树匹配HTTP请求.令人惊奇的是,您可以在任何现有的数据库和数据结构中轻松使用它. grbac的作用是确保指定的资源只能由指定的角色访问.请注意,grbac不负责存储鉴权规则和分辨"当前请求发起者具有哪些角色",更不负责角色的创建.分配等.这意味着您应该首先配置规则信息,并提供每个请求的发起者具有的角色. grb

物联网架构成长之路(56)-SpringCloudGateway+JWT实现网关鉴权

0. 前言 结合前面两篇博客,前面博客实现了Gateway网关的路由功能.此时,如果每个微服务都需要一套帐号认证体系就没有必要了.可以在网关处进行权限认证.然后转发请求到后端服务.这样后面的微服务就可以直接调用,而不需要每个都单独一套鉴权体系.参考了Oauth2和JWT,发现基于微服务,使用JWT会更方便一些,所以准备集成JWT作为微服务架构的认证方式. [https://www.cnblogs.com/wunaozai/p/12512753.html] 物联网架构成长之路(54)-基于Naco

web系统中ACL, RBAC等鉴权系统的异同

ACL, 强调面向资源, 描述对具体资源对象的操作鉴权, 有诸如Zend_ACL(好用), symfony-acl(不好用)等实现 应用场景如:对一条帖子资源的增删改鉴权, 整个鉴权流程中, 权限部分是由具体帖子对象和增删改等操作共同构成的.授权的结果是将 "资源---操作" 组合授权给用户. RBAC,强调面向角色的权限节点鉴权, 描述对功能节点的鉴权,有诸如ThinkPHP-RBAC, sylius/rbac-bundle(symfony)等实现 应用场景如: 依据不同用户角色显示

带鉴权信息的SIP呼叫

INVITE sip:[email protected]/2.0 Via: SIP/2.0/UDP192.168.50.32:2445;branch=z9hG4bK-d8754z-244fd550d2729557-1---d8754z-;rport Max-Forwards: 70 Contact:<sip:[email protected]:2445> To: <sip:[email protected]> From:"1002"<sip:[email 

WebSocket 的鉴权授权方案

引子 WebSocket 是个好东西,为我们提供了便捷且实时的通讯能力.然而,对于 WebSocket 客户端的鉴权,协议的 RFC 是这么说的: This protocol doesn't prescribe any particular way that servers canauthenticate clients during the WebSocket handshake. The WebSocketserver can use any client authentication me

无线端安全登录与鉴权一之Kerberos

无线端登录与鉴权是安全登录以及保证用户数据安全的第一步,也是最重要的一步.之前做过一个安全登录与鉴权的方案,借这个机会,系统的思考一下,与大家交流交流 先介绍一下TX系统使用的Kerberos方案,参考了 http://blog.csdn.net/wulantian/article/details/42418231 的文章 一.概念介绍 Kerberos:起源于希腊神话,是一支守护着冥界长着3个头颅的神犬,在keberos Authentication中,Kerberos的3个头颅代表中认证过程