docker安装gitlab集成OpenLDAP

回顾一下OpenLDAP,请参见上一篇文章 docker安装部署OpenLdap

直接进入主题吧,上一篇已经安装好了OpenLDAP,那么我们就要使用起来,具体怎么用了,这边文章我们来学习下使用gitlab来集成它。

1.创建gitlab-ce

我们使用gitlab镜像为 gitlab/gitlab-ce

提前创建几个目录来供gitlab使用。

           /usr/local/gitlab/data

/usr/local/gitlab/logs

/usr/local/gitlab/config  #这个目录挂载出来是为了方便修改gitlab.rb配置文件

           然后再创建容器

docker run -d    \
--hostname 10.0.43.206    \
--name gitlab-ce     \
--restart always    \
--publish 30022:22 \
--publish 30080:80 \
--publish 30443:443     \
--volume /usr/local/gitlab/data:/var/opt/gitlab     \
--volume /usr/local/gitlab/logs:/var/log/gitlab     \
--volume /usr/local/gitlab/config:/etc/gitlab     \
gitlab/gitlab-ce

容器启动成功后,可以在/usr/local/gitlab/config目录找到gitlab.rb文件

编辑,添加如下命令,注意格式哦~~

vim gitlab.rb

 gitlab_rails['ldap_enabled'] = true
 gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
   main: # 'main' is the GitLab 'provider ID' of this LDAP server
     label: 'LDAP'
     host: '10.0.43.206'
     port: 389
     uid: 'cn'
     method: 'plain' # "tls" or "ssl" or "plain"
     bind_dn: 'cn=admin,dc=youedata,dc=com'
     password: 'youedata2018_'
     allow_username_or_email_login: false
     base: 'ou=People,dc=youedata,dc=com'
     attributes:
       username: ['uid']
       email:    ['mail']
       first_name: 'sn'
 
 EOS

添加完了之后,一定要看下前面结束标志是否变色了,我是用vim,会变色,其他vi是不会变色的。

然后开始刷新配置。在容器中执行。 gitlab-ctl reconfigure

没有报错的话就集成完了。打开gitlab的首页。有LDAP登陆方式了。

注意:这里如果打开首页报错502的话, 就多刷几次,可能是加载还不完全。耐心等待一下。

这时候尴尬的事情发生了,没有账号登陆,所以我们得去创建一个账号来登陆下。

可以用上一篇文章的phpldapadmin工具,也可以用LDAP Admin

我这里使用Java代码来创建账号,然后登陆。

调用代码前,得先去创建一个OU(Organizational Unit),使用LDAP Admin工具,先连接到ldap

创建OU

然后就可以使用代码创建了。

 

贴下代码。比较粗糙,。。。。我自己都看不上。。。。将就看吧。

package com.example.ldap;
 
import java.util.Hashtable;
import java.util.Random;

import javax.naming.AuthenticationException;  
import javax.naming.Context;  
import javax.naming.NamingEnumeration;  
import javax.naming.NamingException;  
import javax.naming.directory.BasicAttribute;  
import javax.naming.directory.BasicAttributes;  
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;

/**
 * @author monkey
 * @date 2019-06-28
 * @desc ldap demo
 */
public class LDAPAuthentication {  

    private final String URL = "ldap://10.0.43.206:389/";
    private final String BASEDN = "ou=people,dc=youedata,dc=com";  // 根据自己情况进行修改
    private final String FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
    private LdapContext ctx = null;  
    private final Control[] connCtls = null;  
    
    private void LDAP_connect() {  
        Hashtable<String, String> env = new Hashtable<String, String>();  
        env.put(Context.INITIAL_CONTEXT_FACTORY, FACTORY);  
        env.put(Context.PROVIDER_URL, URL + BASEDN);  
        env.put(Context.SECURITY_AUTHENTICATION, "simple");  
            
        String root = "cn=admin,dc=youedata,dc=com";  //根据自己情况修改
        env.put(Context.SECURITY_PRINCIPAL, root);   // 管理员  
        env.put(Context.SECURITY_CREDENTIALS, "youedata520");  // 管理员密码
           
        try {  
            ctx = new InitialLdapContext(env, connCtls);  
            System.out.println( "LDAP_connect连接成功" );
               
        } catch (javax.naming.AuthenticationException e) {  
            System.out.println("连接失败:");  
            e.printStackTrace();  
        } catch (Exception e) {  
            System.out.println("连接出错:");  
            e.printStackTrace();  
        }  
           
    }  
  private void closeContext(){  
    if (ctx != null) {  
    try {  
        ctx.close();  
    }  
    catch (NamingException e) {  
        e.printStackTrace();  
    }  
  
}  
  }  
    private String getUserDN(String uid) {  
        String userDN = "";  
        LDAP_connect();  
        try {  
            SearchControls constraints = new SearchControls();  
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);  
              
            NamingEnumeration<SearchResult> en = ctx.search("", "uid=" + 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 += "," + 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;  
    }  
    private  boolean addUser(String usr, String pwd) {  
        
        try {  
            LDAP_connect();  
            BasicAttributes attrsbu = new BasicAttributes();  
            BasicAttribute objclassSet = new BasicAttribute("objectclass");
            //可以和数据库关联,做一个自增,比如mysql存起来
            String str = new Random().nextInt(10000) + "";
            objclassSet.add("inetOrgPerson");  
            objclassSet.add("top");
            objclassSet.add("posixAccount");
            attrsbu.put(objclassSet);
            attrsbu.put("sn", usr);  
            attrsbu.put("cn", usr);  
            attrsbu.put("uid", usr);  
            //邮箱不能重复,不然账号无法登陆
            attrsbu.put("mail", "450416064@qq.com");
            attrsbu.put("gidNumber", str);
            attrsbu.put("uidNumber", str);
            attrsbu.put("homeDirectory", "/home/account");

            attrsbu.put("userPassword", pwd);
            ctx.createSubcontext("uid="+ usr , attrsbu);

            System.out.println("======================>" + usr + "添加成功");
            return true;  
        } catch (NamingException ex) {  
           ex.printStackTrace();  
        }  
        closeContext();  
        return false;  
    }   
    public static void main(String[] args) {  
        LDAPAuthentication ldap = new LDAPAuthentication();  
          
        ldap.LDAP_connect();  
   
        ldap.addUser("qq1111","123456");
        if(ldap.authenricate("qq1111", "123456") == true){

            System.out.println( "该用户认证成功" );

        }

    }  
}  

创建账号登陆之后就成功啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值