目录
一、Docker-compose快速拉起demo测试环境
二、原生部署流程
安装MySQL:5.7数据库
安装openLDAP
修改域名,新增con.ldif
创建一个组织
安装OpenResty
下载后端
下载前端
部署后端
部署前端
三、管理动态字段
钉钉
企业微信
飞书
四、部分报错
Go-Ldap-Admin官网:Go-Ldap-Admin
本文用于记录整个安装部署过程以及过程中遇到的坑。
首先准备一台干净的服务器,配置最好不低于2C4G,当然如果MySQL不在本机部署,那可以将配置降为1C2G。(CentOS7)我也不喜欢用这玩意儿,但是官网是按照这个来的。
仅仅是一个测试用的demo环境!不支持IM以进行数据同步。
docker和docker-compose默认你有,端口映射情况:
Service | Port(宿主机端口:容器端口) |
MySQL | 3307:3306 |
openLDAP | 389:389 |
phpldapadmin | 8091:80 |
go-ldap-admin | 8090:80,8888:8888 |
拉取:
git clone https://github.com/eryajf/go-ldap-admin.git
进入到docker-compose目录之后,目录层级与内容如下:
tree -N docker-compose docker-compose ├── config │ ├── init.ldif │ └── my.cnf └── docker-compose.yaml 1 directory, 3 files
拉起:
cd docs/docker-compose docker-compose up -d
当看到容器都正常运行之后,可以在本地进行访问:http://localhost:8090,用户名/密码:admin/123456
如果想要访问PhpLdapAdmin,则可访问:http://localhost:8091,用户名/密码:cn=admin,dc=eryajf,dc=net/123456
注意:这里有个小坑,在此测试环境中是无法进行钉钉等应用架构同步的,报错如下:
41001: access_token missing, hint: [1681804729372880375054761], from ip: *, more info at https://open.work.weixin.qq.com/devtool/query?e=41001
直到看见作者在GitHub的评论才知道是不支持。
随手关一下:
systemctl disable firewalld.service --now
俺也没试过8.0,官网建议使用5.7。
由于CentOS的yum源中没有mysql,需要到mysql的官网下载yum repo配置文件:
wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm
然后进行repo的安装:
rpm -ivh mysql80-community-release-el7-5.noarch.rpm
根据自己的需要,关闭,或者开启想要的版本:
# 关闭8.0 yum-config-manager --disable mysql80-community # 开启5.7 yum-config-manager --enable mysql57-community
开始安装:
yum install mysql-server -y
Mysql,启动!
systemctl start mysqld
第一次登录查看临时密码:
grep 'temporary password' /var/log/mysqld.log
登录后对密码进行修改:
alter user 'root'@'localhost' identified by 'Abc@1234';
随手执行一下:
use mysql; update user set host = '%' where user ='root';
创建数据库:
CREATE USER 'ldap'@'localhost' IDENTIFIED BY 'Eryajf@123'; CREATE DATABASE IF NOT EXISTS `go_ldap_admin` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; GRANT ALL PRIVILEGES on `go_ldap_admin`.* to 'ldap'@'localhost'; FLUSH privileges;
以yum方式安装:
yum install openldap openldap-clients openldap-servers -y
复制一个默认配置到指定目录下,并授权,这一步一定要做,然后再启动服务,不然生产密码时会报错:
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
授权:
chown -R ldap /var/lib/ldap/DB_CONFIG
启动:
systemctl enable slapd --now
初始化配置,生成密码,这里自己的记录一下{SSHA}这一串,后面需要用到:
slappasswd -s 123456
新增修改密码文件,ldif为后缀,文件名随意,不要在/etc/openldap/slapd.d/目录下创建类似文件 生成的文件为需要通过命令去动态修改ldap现有配置,如下,我在家目录下,创建文件(记得修改{SSHA}密码为上面拿到的那一串):
cd ~ vim changepwd.ldif
dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE # 这里解释一下这个文件的内容: # 第一行执行配置文件,这里就表示指定为 cn=config/olcDatabase={0}config 文件。 # 你到/etc/openldap/slapd.d/目录下就能找到此文件 # 第二行 changetype 指定类型为修改 # 第三行 add 表示添加 olcRootPW 配置项 # 第四行指定 olcRootPW 配置项的值 # 在执行下面的命令前,你可以先查看原本的olcDatabase={0}config文件, # 里面是没有olcRootPW这个项的,执行命令后,你再看就会新增了olcRootPW项, # 而且内容是我们文件中指定的值加密后的字符串
执行命令以修改配置:
ldapadd -Y EXTERNAL -H ldapi:/// -f changepwd.ldif
切记不能直接修改/etc/openldap/slapd.d/目录下的配置。
我们需要向 LDAP 中导入一些基本的 Schema。这些 Schema 文件位于/etc/openldap/schema/目录中,schema控制着条目拥有哪些对象类和属性,可以自行选择需要的进行导入(注意依次执行):
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
这里官方自定义的域名为 eryajf.net,管理员用户账号为admin。 如果要修改,则修改文件中相应的dc=eryajf,dc=net为自己的域名,密码切记改成上面重新生成的哪个。
vim con.ldif
dn: olcDatabase={1}monitor,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=admin,dc=eryajf,dc=net" read by * none dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=eryajf,dc=net dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=admin,dc=eryajf,dc=net dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootPW olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=eryajf,dc=net" write by anonymous auth by self write by * none olcAccess: {1}to dn.base="" by * read olcAccess: {2}to * by dn="cn=admin,dc=eryajf,dc=net" write by * read
执行命令以修改:
ldapmodify -Y EXTERNAL -H ldapi:/// -f con.ldif
确认这里有5条输出,因为进行了5项修改:
启用memberof功能,新增add-memberof.ldif:
vim add-memberof.ldif
dn: cn=module{0},cn=config cn: modulle{0} objectClass: olcModuleList objectclass: top olcModuleload: memberof.la olcModulePath: /usr/lib64/openldap dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config objectClass: olcConfig objectClass: olcMemberOf objectClass: olcOverlayConfig objectClass: top olcOverlay: memberof olcMemberOfDangling: ignore olcMemberOfRefInt: TRUE olcMemberOfGroupOC: groupOfUniqueNames olcMemberOfMemberAD: uniqueMember olcMemberOfMemberOfAD: memberOf
新增refint1.ldif文件:
vim refint1.ldif
dn: cn=module{0},cn=config add: olcmoduleload olcmoduleload: refint
新增refint2.ldif文件:
vim refint2.ldif
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config objectClass: olcConfig objectClass: olcOverlayConfig objectClass: olcRefintConfig objectClass: top olcOverlay: refint olcRefintAttribute: memberof uniqueMember manager owner
依次执行以下命令,顺序不要错:
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add-memberof.ldif
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
到此,配置修改完了,在上述基础上,我们来创建一个叫做 eryajf company 的组织(官网叫这个,根据需求,自行修改),并在其下创建一个 admin 的组织角色(该组织角色内的用户具有管理整个 LDAP 的权限)和 一些初始化必须的组织:
vim base.ldif
dn: dc=eryajf,dc=net objectClass: top objectClass: dcObject objectClass: organization o: Eryajf Company dc: eryajf dn: cn=admin,dc=eryajf,dc=net objectClass: organizationalRole cn: admin dn: ou=people,dc=eryajf,dc=net ou: people description: 用户根目录 objectClass: organizationalUnit dn: ou=dingtalkroot,dc=eryajf,dc=net ou: dingtalkroot description: 钉钉根部门 objectClass: top objectClass: organizationalUnit dn: ou=wecomroot,dc=eryajf,dc=net ou: wecomroot description: 企业微信根部门 objectClass: top objectClass: organizationalUnit dn: ou=feishuroot,dc=eryajf,dc=net ou: feishuroot description: 飞书根部门 objectClass: top objectClass: organizationalUnit
执行命令,添加配置, 这里要注意修改域名为自己配置的域名,然后需要输入上面我们生成的密码123456:
ldapadd -x -D cn=admin,dc=yaobili,dc=com -W -f base.ldif
配置阿里和openresty的yum源:
yum -y install yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
安装:
yum install openresty -y
创建一些软链,便于维护或者规范:
ln -snf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx ln -snf /usr/local/openresty/nginx/conf /etc/nginx
启动服务:
systemctl enable openresty --now
官网上给的下载版本是0.5.9,但是我强烈建议安装0.5.10:
wget https://github.com/eryajf/go-ldap-admin/releases/download/v0.5.10/go-ldap-admin-v0.5.10-linux-amd64.tar.gz
mkdir go-ldap-admin && tar xf go-ldap-admin-v0.5.10-linux-amd64.tar.gz -C go-ldap-admin
wget https://github.com/eryajf/go-ldap-admin-ui/releases/download/v0.5.13/go-ldap-admin-ui-v0.5.13.tar.gz
tar xf go-ldap-admin-ui-v0.5.13.tar.gz
mkdir -p /data/www && mv go-ldap-admin /data/www
根据实际情况进行修改:
vim /data/www/go-ldap-admin/config.yml
应用相关信息获取查看这里:
钉钉:配置钉钉同步 | Go-Ldap-Admin
企业微信:配置企业微信同步 | Go-Ldap-Admin
飞书:配置飞书同步 | Go-Ldap-Admin
添加系统服务:
vim /usr/lib/systemd/system/go-ldap-admin.service
[Unit] Description=Go Ldap Admin Service [Service] WorkingDirectory=/data/www/go-ldap-admin/ ExecStart=/data/www/go-ldap-admin/go-ldap-admin [Install] WantedBy=multi-user.target
启动:
systemctl daemon-reload && systemctl start go-ldap-admin
移动制品:
mv go-ldap-admin-ui /data/www//demo-go-ldap-admin.eryajf.net
在OpenResty中添加如下配置,代理本项目:
mkdir /etc/nginx/conf && vim /etc/nginx/conf/nginx.conf
server { listen 80; server_name demo-go-ldap-admin.eryajf.net; root /data/www//demo-go-ldap-admin.eryajf.net/dist; location / { try_files $uri $uri/ /index.html; add_header Cache-Control 'no-store'; } location /api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8888; } }
记得自己去 include 一下配置文件,默认你懂。
nginx -t nginx -s reload
确保一下服务都起来了:
systemctl status mysqld systemctl status slapd systemctl status go-ldap-admin systemctl status openresty
都启动之后,就可以打开web管理页面
http:ip:端口
http://你的IP/phpldapadmin#/dashboard
默认用户名:admin,默认密码是LDAP设置的密码123456。
在进行同步之前需要先去先建立字段映射:
下面有图片示例。
创建分组的动态关系:
{ "flag": "dingtalk_group", // 字段标识 "attributes": { // 字段属性 "groupName":"custom_name_pinyin", // 分组名称(通常为分组名的拼音) "remark":"name", // 分组描述 "sourceDeptId":"id", // 部门ID "sourceDeptParentId":"parentid" // 父部门ID } }
创建用户的动态关系:
{ "flag": "dingtalk_user", // 字段标识 "attributes": { // 字段属性 "username":"custom_name_pinyin", // 用户名(通常为用户名拼音) "nickname":"name", // 中文名字 "givenName":"name", // 花名 "mail":"email", // 邮箱 "jobNumber":"job_number", // 工号 "mobile":"mobile", // 手机号 "avatar":"avatar", // 头像 "postalAddress":"work_place", // 地址 "position":"title", // 职位 "introduction":"remark", // 说明 "sourceUserId":"userid", // 源用户ID "sourceUnionId":"unionid" // 源用户唯一ID } }
创建分组的动态关系:
{ "flag": "wecom_group", "attributes": { "groupName":"custom_name_pinyin", "remark":"name", "sourceDeptId":"id", "sourceDeptParentId":"parentid" } }
创建用户的动态关系:
{ "flag": "wecom_user", "attributes": { "username":"custom_name_pinyin", "nickname":"name", "givenName":"alias", "mail":"email", "jobNumber":"mobile", "mobile":"mobile", "avatar":"avatar", "postalAddress":"address", "position":"external_position", "introduction":"name", "sourceUserId":"userid", "sourceUnionId":"userid" } }
创建分组的动态关系:
{ "flag": "feishu_group", "attributes": { "groupName":"department_id", "remark":"name", "sourceDeptId":"open_department_id", "sourceDeptParentId":"parent_department_id" } }
创建用户的动态关系:
{ "flag": "feishu_user", "attributes": { "username":"custom_name_pinyin", "nickname":"name", "givenName":"name", "mail":"email", "jobNumber":"employee_no", "mobile":"mobile", "avatar":"avatar", "postalAddress":"work_station", "position":"job_title", "introduction":"name", "sourceUserId":"user_id", "sourceUnionId":"union_id" } }
以企业微信举例,就这样填进去即可:
然后去同步吧~但是需要注意!!!!!!
先同步分组,再同步用户!!!!!
errcode“:41001,“errmsg“:“access_token missing rid:
若你使用的是docker-compose直接拉起的,前面也提到了那对不起,demo版本不支持IM认证。若不是,则是你的自建应用没有设置ip白名单(拿企业微信举例,没错就算你不设置,他也不会让所有ip都正常访问)。
访问:企业微信
找到你的自建应用并到这里配置:
LDAP Result Code 68 "Entry Already Exists"
说明ou已经存在
This base cannot be created with PLA.
此根不能创建ou。找个干净的目录新建文件:base.ldif
vim base.ldif
dn: dc=改成你的,dc=改成你的 o: ldapit objectclass: dcObject objectclass: organization
执行,记得修改内容:
ldapadd -f base.ldif -x -D cn=admin,dc=改成你的,dc=改成你的 -W
ldap_add: Invalid syntax (21)
additional info: objectclass: value #0 invalid per syntax
配置文件格式或内容存在错误
record not found
若你使用的是本文中的最新版本,则问题在于你的字段填写,请检查字段映射是否正确。若你使用的是官网中的安装版本,建议替换到最新版本进行安装。