Anda akan berpikir bahwa mengautentikasi pengguna di Active Directory akan menjadi proses yang cukup sederhana menggunakan LDAP di PHP tanpa memerlukan perpustakaan. Tetapi ada banyak hal yang dapat memperumitnya dengan cukup cepat:
- Anda harus memvalidasi masukan. Nama pengguna / kata sandi kosong akan lolos sebaliknya.
- Anda harus memastikan nama pengguna / kata sandi dikodekan dengan benar saat mengikat.
- Anda harus mengenkripsi koneksi menggunakan TLS.
- Menggunakan server LDAP terpisah untuk redundansi jika ada yang tidak berfungsi.
- Mendapatkan pesan kesalahan informatif jika otentikasi gagal.
Sebenarnya lebih mudah dalam banyak kasus untuk menggunakan pustaka LDAP yang mendukung hal di atas. Saya akhirnya akhirnya menggulung perpustakaan saya sendiri yang menangani semua poin di atas: LdapTools (Yah, tidak hanya untuk otentikasi, itu dapat melakukan lebih banyak lagi). Ini dapat digunakan seperti berikut:
use LdapTools\Configuration;
use LdapTools\DomainConfiguration;
use LdapTools\LdapManager;
$domain = (new DomainConfiguration('example.com'))
->setUsername('username') # A separate AD service account used by your app
->setPassword('password')
->setServers(['dc1', 'dc2', 'dc3'])
->setUseTls(true);
$config = new Configuration($domain);
$ldap = new LdapManager($config);
if (!$ldap->authenticate($username, $password, $message)) {
echo "Error: $message";
} else {
// Do something...
}
Panggilan otentikasi di atas akan:
- Validasi bahwa baik nama pengguna atau kata sandi tidak kosong.
- Pastikan nama pengguna / kata sandi dikodekan dengan benar (UTF-8 secara default)
- Coba server LDAP alternatif jika salah satu sedang down.
- Enkripsi permintaan otentikasi menggunakan TLS.
- Berikan informasi tambahan jika gagal (mis. Akun terkunci / dinonaktifkan, dll)
Ada perpustakaan lain untuk melakukan ini juga (seperti Adldap2). Namun, saya merasa cukup terdorong untuk memberikan beberapa informasi tambahan karena jawaban yang paling banyak dipilih sebenarnya adalah risiko keamanan yang dapat diandalkan tanpa validasi input yang dilakukan dan tidak menggunakan TLS.