Отклонить запрос 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?

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам