java调用ldap

配置yml

spring:
  ldap:
    urls: ldap://172.xx.xx.xxx:389/
    base: cn=users,dc=node3,dc=com
    username: cn=admin,dc=node3,dc=com
    password: 123456

我这边采用的是openldap

urls:是ldap安装布署的地址:ldap默认的端口是389

base: cn=users,dc=node3,dc=com  解释:要操作dc=node3,dc=com下面的cn=users的文件夹下的数据,如下图所示:

 username: cn=admin,dc=node3,dc=com 解释:cn=admin进行你的登录账号 dc=node3 dc=com 就是我用admin账号登录操作dc=node3,dc =com 这个文件

password:123456  解释: admin的密码

映射yml中的配置项

@Component
@Data
public class Parameters {

    @Value("${spring.ldap.urls}")
    public  String URL;

    @Value("${spring.ldap.base}")
    public  String BASEDN;

    @Value("${spring.ldap.username}")
    public  String username;

    @Value("${spring.ldap.password}")
    public  String password;
}

编写工具类

@Component
public class LdapTool {

    @Autowired
    private Parameters parameters;

    private final String FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";

    private LdapContext ctx = null;

    private final Control[] connCtls = null;

    public LdapContext  LDAP_connect() {
        Hashtable<String, String> env = new Hashtable<String, String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, FACTORY);
        env.put(Context.PROVIDER_URL, parameters.URL + parameters.BASEDN);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, parameters.username);   // 管理员
        env.put(Context.SECURITY_CREDENTIALS, parameters.password);  // 管理员密码
        try {
            ctx = new InitialLdapContext(env, connCtls);
            System.out.println( "连接成功" );
            return  ctx;
        } catch (javax.naming.AuthenticationException e) {
            System.out.println("连接失败:");
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("连接出错:"+e.getMessage());
            e.printStackTrace();
        }
        return null;
    }
    private void closeContext(){
        if (ctx != null) {
            try {
                ctx.close();
            }
            catch (NamingException e) {
                e.printStackTrace();
            }

        }
    }
    public String getUserDN(String uid) {
        String userDN = "";
        LDAP_connect();
        try {
            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

            NamingEnumeration<SearchResult> en = ctx.search("", "uidNumber=" + uid, constraints);

            if (en == null || !en.hasMoreElements()) {
                System.out.println("未找到该用户");
            }
            // maybe more than one element
            while (en != null && en.hasMoreElements()) {
                Object obj = en.nextElement();
                if (obj instanceof SearchResult) {
                    SearchResult si = (SearchResult) obj;
                    userDN += si.getName();
                    userDN += "," + parameters.BASEDN;
                } else {
                    System.out.println(obj);
                }
            }
        } catch (Exception e) {
            System.out.println("查找用户时产生异常。");
            e.printStackTrace();
        }

        return userDN;
    }

    public boolean authenricate(String UID, String password) {
        boolean valide = false;
        String userDN = getUserDN(UID);

        try {
            ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
            ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
            ctx.reconnect(connCtls);
            System.out.println(userDN + " 验证通过");
            valide = true;
        } catch (AuthenticationException e) {
            System.out.println(userDN + " 验证失败");
            System.out.println(e.toString());
            valide = false;
        } catch (NamingException e) {
            System.out.println(userDN + " 验证失败");
            valide = false;
        }
        closeContext();
        return valide;
    }

    /**
     * 获取用户信息
     * @param
     * @param basedn
     * @return
     */
    public List<LdapUser> readLdap(LdapContext ctx){

        List<LdapUser> lm=new ArrayList<LdapUser>();
        try {
            if(ctx!=null){
                //过滤条件
                String filter = "(&(objectClass=*)(uid=*))";
                String[] attrPersonArray = { "uid", "userPassword", "displayName", "cn", "sn", "mail", "description","uidNumber","gidNumber" };
                SearchControls searchControls = new SearchControls();//搜索控件
                searchControls.setSearchScope(2);//搜索范围
                searchControls.setReturningAttributes(attrPersonArray);
                //1.要搜索的上下文或对象的名称;2.过滤条件,可为null,默认搜索所有信息;3.搜索控件,可为null,使用默认的搜索控件
                NamingEnumeration<SearchResult> answer = ctx.search("",filter.toString(),searchControls);
                while (answer.hasMore()) {
                    SearchResult result = (SearchResult) answer.next();
                    NamingEnumeration<? extends Attribute> attrs = result.getAttributes().getAll();
                    LdapUser lu=new LdapUser();
                    while (attrs.hasMore()) {
                        Attribute attr = (Attribute) attrs.next();
                        if("userPassword".equals(attr.getID())){
                            Object value = attr.get();
                            lu.setUserPassword(new String((byte [])value));
                        }else if("uid".equals(attr.getID())){
                            lu.setUid(attr.get().toString());
                        }else if("displayName".equals(attr.getID())){
                            lu.setDisplayName(attr.get().toString());
                        }else if("cn".equals(attr.getID())){
                            lu.setCn(attr.get().toString());
                        }else if("sn".equals(attr.getID())){
                            lu.setSn(attr.get().toString());
                        }else if("mail".equals(attr.getID())){
                            lu.setMail(attr.get().toString());
                        }else if("description".equals(attr.getID())){
                            lu.setDescription(attr.get().toString());
                        }else if ("uidNumber".equals(attr.getID())){
                            lu.setUidNumber(attr.get().toString());
                        }else if ("gidNumber".equals(attr.getID())){
                            lu.setGidNumber(attr.get().toString());
                        }
                    }
                    if(lu.getUid()!=null) {
                        lm.add(lu);
                    }
                }
            }
        }catch (Exception e) {
            System.out.println("获取用户信息异常:");
            e.printStackTrace();
        }finally {
            closeContext();
        }

        return lm;
    }

}

controller层调用

@RestController
public class Mac {

    @Autowired
    private Parameters parameters;

    @Autowired
    LdapTool ldapTool;

    @GetMapping("/long")
    public String gerMessge(@RequestParam("userName") String userName,@RequestParam("password") String password){
        LdapContext ldapContext = ldapTool.LDAP_connect();
        if (ldapContext !=null){
            if (ldapTool.authenricate(userName,password) == true){
                return "登录成功";
            }else{
                return "登录失败";
            }
        }
        return "LDAP服务调用失败";
    }
    @GetMapping("getUserAll")
    public List<LdapUser> getUser(){
        LdapContext ldapContext = ldapTool.LDAP_connect();
        List<LdapUser> ldapUsers =  ldapTool.readLdap(ldapContext);
        return  ldapUsers;
    }

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LDAP(Lightweight Directory Access Protocol)是一种轻量级目录访问协议,旨在提供对目录服务的快速访问。在Java中,可以通过使用JNDI(Java Naming and Directory Interface)API来操作LDAP。 下面是一些Java操作LDAP的常见步骤和示例代码: 1.创建连接对象 ``` 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://localhost:389"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=admin,dc=example,dc=com"); env.put(Context.SECURITY_CREDENTIALS, "password"); DirContext ctx = new InitialDirContext(env); ``` 2.查询数据 ``` String base = "ou=people,dc=example,dc=com"; String filter = "(objectclass=person)"; SearchControls sc = new SearchControls(); sc.setSearchScope(SearchControls.SUBTREE_SCOPE); NamingEnumeration<SearchResult> results = ctx.search(base, filter, sc); while (results.hasMore()) { SearchResult sr = (SearchResult) results.next(); // 处理查询结果 } ``` 3.添加数据 ``` Attributes attrs = new BasicAttributes(); attrs.put("cn", "John Smith"); attrs.put("sn", "Smith"); attrs.put("givenName", "John"); attrs.put("mail", "[email protected]"); attrs.put("userPassword", "password"); ctx.createSubcontext("cn=John Smith,ou=people,dc=example,dc=com", attrs); ``` 4.修改数据 ``` ModificationItem[] mods = new ModificationItem[1]; mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("mail", "[email protected]")); ctx.modifyAttributes("cn=John Smith,ou=people,dc=example,dc=com", mods); ``` 5.删除数据 ``` ctx.destroySubcontext("cn=John Smith,ou=people,dc=example,dc=com"); ``` 这些是Java操作LDAP的一些基本步骤和示例代码,但实际应用中还需要考虑LDAP服务器的具体配置和授权等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值