回顾一下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( "该用户认证成功" );
}
}
}
创建账号登陆之后就成功啦。