Назад | Перейти на главную страницу

Отклонить запрос Nginx без аутентификации в целом

Можно ли отклонить все запросы nginx, которые не отправляют с ними базовые данные аутентификации?

У меня есть такие запросы:

xxx.xxx.xxx.xxx - - [24/Oct/2012:10:32:12 +0200] "POST /path HTTP/1.1" 401 1387 "-" "Apache-HttpClient/4.1.1 (java 1.5)" "-"
xxx.xxx.xxx.xxx - paul [24/Oct/2012:10:32:12 +0200] "POST /path HTTP/1.1" 200 192 "-" "Apache-HttpClient/4.1.1 (java 1.5)" "-"

и я хочу отклонить первый, который не предоставляется пользователю. Как вы можете видеть, он уже отправляет HTTP-код 401, но этот код создается не напрямую из nginx, а из базового сервера приложений. Я хочу прямо отрицать это в nginx. Есть ли способ проверить, предоставлен ли пользователь?

И возможно ли это без настройки обычной базовой аутентификации непосредственно в nginx?

Nginx хранит имя пользователя, полученное в результате аутентификации, в $remote_user. Вы должны иметь возможность проверить, не пусто ли оно, и соответственно выполнить желаемое действие (например, вернуть ошибку 401). Что-то вроде:

if ($remote_user = ''){
    return 401;
}

Судя по всему, вы уже заполняете $remote_user переменная (поскольку она отображается в ваших журналах) - насколько я знаю, вы должны использовать Nginx Базовый модуль HTTP Auth для заполнения этой переменной.

Обычная проверка подлинности устанавливает заголовок авторизации. В Nginx заголовки HTTP-запросов доступны через $http_HEADER, так что в этом случае $http_authorization. Если вы реализуете базовую аутентификацию вне Nginx и задаете этот заголовок, вы можете проверить, не является ли заголовок пустым. (В качестве альтернативы, в зависимости от того, как вы реализуете аутентификацию, вы можете установить собственный заголовок, который вы тестируете).