Bạn sẽ nghĩ rằng chỉ cần xác thực một người dùng trong Active Directory sẽ là một quá trình khá đơn giản bằng cách sử dụng LDAP trong PHP mà không cần thư viện. Nhưng có rất nhiều thứ có thể làm phức tạp nó khá nhanh:
- Bạn phải xác nhận đầu vào. Tên người dùng / mật khẩu trống sẽ vượt qua nếu không.
- Bạn nên đảm bảo tên người dùng / mật khẩu được mã hóa đúng cách khi ràng buộc.
- Bạn nên mã hóa kết nối bằng TLS.
- Sử dụng các máy chủ LDAP riêng biệt để dự phòng trong trường hợp một máy chủ gặp sự cố.
- Nhận được thông báo lỗi thông tin nếu xác thực không thành công.
Trong hầu hết các trường hợp, việc sử dụng thư viện LDAP hỗ trợ điều trên thực sự dễ dàng hơn. Cuối cùng tôi đã hoàn thành thư viện của riêng mình xử lý tất cả các điểm trên: LdapTools (Chà, không chỉ để xác thực, nó có thể làm được nhiều hơn thế). Nó có thể được sử dụng như sau:
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...
}
Cuộc gọi xác thực ở trên sẽ:
- Xác thực rằng không có tên người dùng hoặc mật khẩu nào trống.
- Đảm bảo tên người dùng / mật khẩu được mã hóa đúng cách (UTF-8 theo mặc định)
- Hãy thử một máy chủ LDAP thay thế trong trường hợp một máy chủ gặp sự cố.
- Mã hóa yêu cầu xác thực bằng TLS.
- Cung cấp thông tin bổ sung nếu không thành công (ví dụ: tài khoản bị khóa / bị vô hiệu hóa, v.v.)
Có những thư viện khác cũng làm việc này (Chẳng hạn như Adldap2). Tuy nhiên, tôi cảm thấy đủ bắt buộc phải cung cấp một số thông tin bổ sung vì câu trả lời được nhiều người bình chọn nhất thực sự là một rủi ro bảo mật dựa vào mà không thực hiện xác thực đầu vào và không sử dụng TLS.