Có một mô-đun bên thứ 3 nginx-auth-ldapmà bạn có thể sử dụng. Tôi chưa thử, nhưng tôi có thể cập nhật câu trả lời của mình sau.
sử dụng nginx X-accel
Các tài liệu cho X-accelchỉ giải thích rằng một trang có thể sử dụng một tiêu đề để có nginx phục vụ một tập tin (chứ không phải là PHPhay djangohay rubyhay tên của bạn-không-như-hiệu quả-as-nginx-stack-đây ).
ví dụ quy trình làm việc:
- lượt truy cập của người dùng
/download.php?path=/data/file1.txt,
download.phptrả về WWW-Authenticate+ 401 Unauthorized,
- Trình duyệt của người dùng hiển thị biểu mẫu xác thực và thử lại ,
- lượt truy cập của người dùng
/download.php?path=/data/file1.txtnhưng hiện nginxcó thông tin đăng nhập,
nginxcó thể vượt qua $remote_uservà $http_authorizationđến fastcgikịch bản,
download.phpxác thực và quyết định trả lại 403 Forbiddenhoặc đặt tiêu X-Accel-Redirectđề.
thiết lập internalvị trí nginx
Mặc dù bạn có thể sử dụng X-Accelđể phân phát tài sản tĩnh, trường hợp sử dụng ở đây là chúng tôi muốn các yêu cầu được xác thực, đó là lý do tại sao chúng tôi sử dụng internal.
location /protected/data/ {
internal;
alias /path/to/data/files/;
}
thiết lập tập lệnh tải xuống
Ở đây chúng tôi đi:
location /download.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME /scripts/download.php;
fastcgi_param PHP_AUTH_USER $remote_user;
fastcgi_param PHP_AUTH_PW $http_authorization;
include fastcgi_params;
}
xin lưu ý : tập lệnh PHP sử dụng PHP_AUTH_USERvà PHP_AUTH_PW, được nắm bắt bởinginx , vì vậy để sử dụng chúng trong tập lệnh PHP, chúng tôi cần cung cấp để cung cấp cho chúng một cách rõ ràng.
nấu một xác thực ldap trong PHP
Đối với trường hợp sử dụng của tôi, tôi đã cài đặt php-fpmvà php-ldaptrên hệ thống của tôi.
Đây là một chức năng xác thực phong nha:
function authenticate() {
// I'm watching you.
error_log("authreq: " . $_SERVER['REMOTE_ADDR']);
// mark that we're seeing the login box.
$_SESSION['AUTH'] = 1;
// browser shows login box
Header("WWW-Authenticate: Basic realm=LDAP credentials.");
Header("HTTP/1.0 401 Unauthorized");
die('Unauthorized.');
}
Đây là một đường dẫn mã tốt cho truy cập bị cấm:
function forbidden() {
error_log("forbidden: " . $_SERVER['REMOTE_ADDR'] . ', user: ' . $_SERVER['PHP_AUTH_USER']);
// avoid brute force attacks
sleep(rand(0, 3));
// re-display login form
session_destroy();
// don't give too much info (e.g. user does not exist / password is wrong)
Header("HTTP/1.0 403 Forbidden");
// yes I did put the same message.
die('Unauthorized.');
}
Và đối với phần xác thực LDAP:
function ldap_auth() {
$ldap_server = 'ldap://ldap.example.com/';
$ldap_domain = 'dc=example,dc=com';
$ldap_userbase = 'ou=Users,' . $ldap_domain;
$ldap_user = 'uid=' . $_SERVER['PHP_AUTH_USER'] . ',' . $ldap_userbase;
$ldap_pass = $_SERVER['PHP_AUTH_PW'];
// connect to ldap server
$ldapconn = ldap_connect($ldap_server)
or die("Could not connect to LDAP server.");
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3) ;
if ($ldapconn) {
// try to bind/authenticate against ldap
$ldapbind = @ldap_bind($ldapconn, $ldap_user, $ldap_pass) || forbidden();
// "LDAP bind successful...";
error_log("success: " . $_SERVER['REMOTE_ADDR'] . ', user: ' . $_SERVER['PHP_AUTH_USER']);
}
ldap_close($ldapconn);
}
Ở đây bạn có phần chính của tập lệnh sử dụng uri yêu cầu.
if (@$_SESSION['AUTH'] != 1) {
authenticate();
}
if (empty($_SERVER['PHP_AUTH_USER'])) {
authenticate();
}
// check credentials on each access
ldap_auth();
// Get requested file name
// you can use the query string or a parameter
// or the full request uri if you like.
$path = $_GET["path"];
error_log("serving: " . $_SERVER['REMOTE_ADDR'] . ', user: ' . $_SERVER['PHP_AUTH_USER'] . ', path: ' . $path);
header("Content-Type: ", true);
header("X-Accel-Redirect: /protected" . $path);
duyệt tập tin bán trong suốt
Tôi cũng đã xuất bản này như là một ý chính :
location /protected/data/ {
internal;
autoindex on;
alias /path/to/data/files/;
}
location /data/ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME /scripts/auth.php;
fastcgi_param PHP_AUTH_USER $remote_user;
fastcgi_param PHP_AUTH_PW $http_authorization;
include fastcgi_params;
}
và khá nhiều tập lệnh PHP giống nhau ngoại trừ phần thân:
// Get requested file name
$path = $_SERVER["REQUEST_URI"];
error_log("serving: " . $_SERVER['REMOTE_ADDR'] . ', user: ' . $_SERVER['PHP_AUTH_USER'] . ', path: ' . $path);
header("Content-Type: ", true);
header("X-Accel-Redirect: /protected" . $path);