Đây là giải pháp của tôi, hy vọng nó sẽ giúp ích.
Đây là của tôi kiến trúc sư hệ thống proxy
Đây là cấu hình trong nginx
email {
auth_http localhost:80/ldap_auth.php;
pop3_capabilities "TOP" "USER";
imap_capabilities "IMAP4rev1" "UIDPLUS";
người phục vụ {
nghe 110;
giao thức pop3;
pop3_auth đơn giản apop cram-md5;
bật proxy;
}
người phục vụ {
nghe 143;
hình ảnh giao thức;
bật proxy;
}
}
Đây là mã nguồn trong ldap_auth.php
<?php
if (!isset($_SERVER["HTTP_AUTH_USER"]) || !isset($_SERVER["HTTP_AUTH_PASS"])) {
Thất bại();
}
$username = $_SERVER["HTTP_AUTH_USER"];
$userpass = $_SERVER["HTTP_AUTH_PASS"];
$protocol = $_SERVER["HTTP_AUTH_PROTOCOL"];
// cổng phụ trợ mặc định
$backend_port = 110;
if ($protocol == "imap") {
$backend_port = 143;
}
$backend_ip["domain1.com"] = "10.0.250.251";
$backend_ip["domain2.com"] = "10.0.220.140";
// Xác thực người dùng hoặc thất bại
if (!authuser($username, $userpass)) {
Thất bại();
lối ra;
}
$userserver = getmaildomain($username);
$server_ip = (isset($backend_ip[$userserver])) ? $backend_ip[$userserver] : $userserver;
// Vượt qua!
vượt qua($server_ip, $backend_port);
//CHẤM DỨT
chức năng authuser($user, $pass)
{
$pass = str_replace('%20', ' ', $pass);
$pass = str_replace('%25', '%', $pass);
$emailDomain = getmaildomain($user);
$emailUsername = getmailuser($user);
$ldapconfig['máy chủ'] = '10.0.250.241';
$ldapconfig['port'] = '389';
$ldapconfig['basedn'] = 'ou=' . $emailDomain . ',dc=topdomain,dc=vn';
$ldapconfig['binduser'] = 'cn=admin,dc=topdomain,dc=vn';
$ldapconfig['bindpass'] = 'P@ssw0rd';
$ds = ldap_connect($ldapconfig['host'], $ldapconfig['port']);
if (isset($ds)) {
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
ldap_set_option($ds, LDAP_OPT_NETWORK_TIMEOUT, 10);
if (isset($user) && isset($pass)) {
if (ldap_bind($ds, $ldapconfig['binduser'], $ldapconfig['bindpass'])) {
if ($search_result = ldap_search($ds, $ldapconfig['basedn'], "(|(uid=%U)(sAMAccountName=%U))")) {
$entries = ldap_get_entries($ds, $search_result);
if ($entries['count'] == 1) {
$dn = $entries[0]['dn'];
nếu (ldap_bind($ds, $dn, $pass)) {
trả về đúng;
} khác {
trả về sai;
}
}
}
}
}
}
trả về sai;
}
hàm getmaildomain($user)
{
trả về chất nền($user, strpos($user, '@') + 1);
}
hàm getmailuser($user)
{
trả về chất nền($user, 0, strpos($user, '@'));
}
chức năng thất bại()
{
header("Auth-Status: Tên đăng nhập hoặc mật khẩu không hợp lệ");
lối ra;
}
vượt qua chức năng ($ máy chủ, $ cổng)
{
tiêu đề ("Trạng thái xác thực: OK");
header("Auth-Server: $server");
header("Auth-Port: $port");
lối ra;
}
đây là cấu hình trong OpenLDAP Font-end
bao gồm /etc/ldap/schema/core.schema
bao gồm /etc/ldap/schema/corba.schema
bao gồm /etc/ldap/schema/cosine.schema
bao gồm /etc/ldap/schema/duaconf.schema
bao gồm /etc/ldap/schema/dyngroup.schema
bao gồm /etc/ldap/schema/inetorgperson.schema
bao gồm /etc/ldap/schema/java.schema
bao gồm /etc/ldap/schema/misc.schema
bao gồm /etc/ldap/schema/nis.schema
bao gồm /etc/ldap/schema/openldap.schema
bao gồm /etc/ldap/schema/collective.schema
bao gồm /etc/ldap/schema/pmi.schema
bao gồm /etc/ldap/schema/ppolicy.schema
cho phép bind_v2
# Xác định ACL toàn cầu để tắt quyền truy cập đọc mặc định.
# Không kích hoạt giới thiệu cho đến SAU KHI bạn có một thư mục làm việc
# dịch vụ VÀ sự hiểu biết về giới thiệu.
#giới thiệu ldap://root.openldap.org
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
# Tải các mô-đun phụ trợ động:
đường dẫn mô-đun/usr/lib/ldap
tải mô-đun rwm.la
tải mô-đun back_meta.la
tải mô-đun back_ldap.la
loglevel -1
################################################# #####################
# Định nghĩa máy chủ từ xa LDAP
################################################# #####################
#Phông chữ
cơ sở dữ liệu meta
hậu tố "dc=topdomain,dc=vn"
rootdn "cn=admin,dc=topdomain,dc=vn"
rootpw P@ssw0rd
#doamin1.vn - Máy Chủ
uri "ldap://10.0.250.251/ou=domain1.vn,dc=topdomain,dc=vn"
chỉ đọc không
tắt lần cuối
hậu tốmassage "ou=domain1.vn,dc=topdomain,dc=vn" "DC=domain1,DC=vn"
thuộc tính bản đồ uid sAMAccountName
idassert-bind bindmethod=đơn giản
binddn="CN=ldap,CN=Users,DC=domain1,DC=vn"
thông tin xác thực = "P@ssw0rd"
idassert-authzTừ "dn.exact:cn=admin,dc=topdomain,dc=vn"
#doamin1.vn - Máy Chủ
uri "ldap://10.0.220.45/ou=domain2.vn,dc=topdomain,dc=vn"
chỉ đọc không
tắt lần cuối
hậu tốmassage "ou=domain2.vn,dc=topdomain,dc=vn" "DC=domain2,DC=vn"
thuộc tính bản đồ uid sAMAccountName
idassert-bind bindmethod=đơn giản
binddn="CN=Quản trị viên LDAP,CN=Người dùng,DC=domain2,DC=vn"
thông tin xác thực = "P@ssw0rd"
idassert-authzTừ "dn.exact:cn=admin,dc=topdomain,dc=vn"