Aceasta este soluția mea, sper să vă ajute.
Acesta este al meu arhitect sistem proxy
Acesta este configurat în nginx
Poștă {
auth_http localhost:80/ldap_auth.php;
pop3_capabilities „TOP” „USER”;
imap_capabilities „IMAP4rev1” „UIDPLUS”;
Server {
asculta 110;
protocol pop3;
pop3_auth plain apop cram-md5;
proxy activat;
}
Server {
asculta 143;
protocol imap;
proxy activat;
}
}
Acesta este codul sursă în ldap_auth.php
<?php
dacă (!isset($_SERVER["HTTP_AUTH_USER"]) || !isset($_SERVER["HTTP_AUTH_PASS"])) {
fail();
}
$nume utilizator = $_SERVER["HTTP_AUTH_USER"];
$userpass = $_SERVER["HTTP_AUTH_PASS"];
$protocol = $_SERVER["HTTP_AUTH_PROTOCOL"];
// port de backend implicit
$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";
// Autentifică utilizatorul sau eșuează
if (!authuser($nume utilizator, $userpass)) {
fail();
Ieșire;
}
$userserver = getmaildomain($nume utilizator);
$server_ip = (isset($backend_ip[$userserver])) ? $backend_ip[$userserver] : $userserver;
// Trece!
trece($server_ip, $backend_port);
//SFÂRŞIT
function authuser($utilizator, $trece)
{
$pass = str_replace('%20', '', $pass);
$pass = str_replace('%25', '%', $pass);
$emailDomain = getmaildomain($user);
$emailUsername = getmailuser($user);
$ldapconfig['gazdă'] = '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['gazdă'], $ldapconfig['port']);
dacă (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($utilizator) && isset($trece)) {
dacă (ldap_bind($ds, $ldapconfig['binduser'], $ldapconfig['bindpass'])) {
dacă ($search_result = ldap_search($ds, $ldapconfig['basedn'], "(|(uid=%U)(sAMAccountName=%U))")) {
$intries = ldap_get_entries($ds, $search_result);
dacă ($intrii['număr'] == 1) {
$dn = $intrii[0]['dn'];
if (ldap_bind($ds, $dn, $pass)) {
returnează adevărat;
} altfel {
returnează fals;
}
}
}
}
}
}
returnează fals;
}
funcția getmaildomain($user)
{
return substr($utilizator, strpos($utilizator, '@') + 1);
}
funcția getmailuser($user)
{
return substr($utilizator, 0, strpos($utilizator, '@'));
}
funcția fail()
{
header("Stare-autentificare: autentificare sau parolă nevalidă");
Ieșire;
}
trecerea funcției ($server, $port)
{
header("Stare-autentificare: OK");
header("Auth-Server: $server");
header("Auth-Port: $port");
Ieșire;
}
aceasta este configurația în OpenLDAP Font-end
includ /etc/ldap/schema/core.schema
includ /etc/ldap/schema/corba.schema
includ /etc/ldap/schema/cosine.schema
includ /etc/ldap/schema/duaconf.schema
includ /etc/ldap/schema/dyngroup.schema
includ /etc/ldap/schema/inorgperson.schema
includ /etc/ldap/schema/java.schema
includ /etc/ldap/schema/misc.schema
includ /etc/ldap/schema/nis.schema
includ /etc/ldap/schema/openldap.schema
includ /etc/ldap/schema/collective.schema
includ /etc/ldap/schema/pmi.schema
includ /etc/ldap/schema/ppolicy.schema
permite bind_v2
# Definiți ACL-uri globale pentru a dezactiva accesul implicit de citire.
# Nu activați recomandările decât după ce aveți un director de lucru
# serviciu ȘI o înțelegere a recomandărilor.
#referință ldap://root.openldap.org
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
# Încărcați module backend dinamice:
modulepath /usr/lib/ldap
moduleload rwm.la
moduleload back_meta.la
moduleload back_ldap.la
loglevel -1
#################################################################### #####################
# Definiții server la distanță LDAP
#################################################################### #####################
#font
meta bază de date
sufixul „dc=topdomain,dc=vn”
rootdn „cn=admin,dc=topdomain,dc=vn”
rootpw P@ssw0rd
#doamin1.vn - Server
uri „ldap://10.0.250.251/ou=domain1.vn,dc=topdomain,dc=vn”
numai citit nu
lastmod off
sufixmassage „ou=domain1.vn,dc=topdomain,dc=vn” „DC=domain1,DC=vn”
atributul map uid sAMAccountName
idassert-bind bindmethod=simplu
binddn="CN=ldap,CN=Utilizatori,DC=domain1,DC=vn"
credentials="P@ssw0rd"
idassert-authzDe la „dn.exact:cn=admin,dc=topdomain,dc=vn”
#doamin1.vn - Server
uri „ldap://10.0.220.45/ou=domain2.vn,dc=topdomain,dc=vn”
numai citit nu
lastmod off
sufixmassage „ou=domain2.vn,dc=topdomain,dc=vn” „DC=domain2,DC=vn”
atributul map uid sAMAccountName
idassert-bind bindmethod=simplu
binddn="CN=Administrator LDAP,CN=Utilizatori,DC=domeniu2,DC=vn"
credentials="P@ssw0rd"
idassert-authzDe la „dn.exact:cn=admin,dc=topdomain,dc=vn”