Có một mô-đun bên thứ 3 nginx-auth-ldap
mà 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-accel
chỉ 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à PHP
hay django
hay ruby
hay 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.php
trả 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.txt
nhưng hiện nginx
có thông tin đăng nhập,
nginx
có thể vượt qua $remote_user
và $http_authorization
đến fastcgi
kịch bản,
download.php
xác thực và quyết định trả lại 403 Forbidden
hoặc đặt tiêu X-Accel-Redirect
đề.
thiết lập internal
vị 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_USER
và 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-fpm
và php-ldap
trê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);