我正在尝试使用nginx基本身份验证来保护我的webapp。
我正在寻找的是一种强制浏览器显示我的自定义html登录页面而不是默认登录弹出窗口但仍处理授权过程的方法。
我尝试省略'WWW-Authenticate'标题并且弹出窗口没有显示但是我不知道如何强制浏览器为每个请求添加'Authorization'标题。
特此nginx.conf:
location /{
auth_basic "Restricted";
auth_basic_user_file htpasswd;
proxy_pass http://tomcat:8080/;
error_page 401 /login.html;
}
location = /login.html {
root html;
more_clear_headers 'WWW-Authenticate';
}
答案 0 :(得分:0)
如果你真的想这样做。最简单的方法是将用户名和密码放入网址。基本身份验证支持此功将所有请求更改为以下格式,它将起作用:
"http://" + username + ":" + password + "@example.com"
答案 1 :(得分:0)
您需要添加 proxy_intercept_errors on;
,否则您将无法定义 error_page
。否则 NGINX 只会将 HTTP 401 响应传递回客户端。
location /{
auth_basic "Restricted";
auth_basic_user_file htpasswd;
proxy_pass http://tomcat:8080/;
proxy_intercept_errors on;
error_page 401 /login.html;
}
location = /login.html {
root html;
more_clear_headers 'WWW-Authenticate';
}
<块引用>
语法:proxy_intercept_errors on |关闭;
默认值:proxy_intercept_errors 关闭;
上下文:http、服务器、位置
确定代码大于或等于 300 的代理响应是应该传递给客户端还是被拦截并重定向到 nginx 以使用 error_page 指令进行处理。
答案 2 :(得分:-1)
*有*是实现此目的的更好方法,但是我设法使用X-Accel-Redirect和php来做到这一点,方法如下:
我想为/ foo /文件夹创建一个自定义登录页面(并递归所有内容)
...首先,我将磁盘文件夹/var/www/html/foo
重命名为/var/www/html/internal_foo
,然后将其添加到nginx config中:
location ~ /internal_foo {
internal;
# even if this is the default root, the internal-directive seems to prevent inheriting the root directive, so have to explicitly specify it here...
root /var/www/html;
}
location ~ /foo {
try_files "" /foo.php$is_args$args;
}
然后我创建了一个/var/www/html/foo.php
并包含以下内容:
<?php
// warning: script vulnerable to timing attack which can disclose existence of files. (realpath() is not constant-time)
if(is_authorised()){
$translated="/internal_foo/".urldecode(substr($_SERVER['REQUEST_URI'],strlen("/foo/")));
$file=__DIR__.$translated;
$file=realpath($file);
if(false===$file){http_response_code(404);exit();}
if(0!==strpos($file,__DIR__.DIRECTORY_SEPARATOR."internal_foo")){
// probably a hacker attempting ../../../etc/passwd schenanigans.
http_response_code(400);
exit();
}
header("X-accel-redirect: ".$translated);
}else{
show_loginpage();
}
瞧,如果用户被授权,则请求将发送到nginx,否则将执行show_loginpage();
(您可以在其中放置自定义登录页面),任务已完成:)