Apache AuthzSendUnauthorizedOnFailure? - PullRequest
       7

Apache AuthzSendUnauthorizedOnFailure?

1 голос
/ 03 октября 2019

Мне было интересно, могу ли я заставить apache отправлять HTTP 401 вместо HTTP 403 в случае сбоя какого-либо условия внутри RequireAll. Удивительно, но я обнаружил AuthzSendForbiddenOnFailure, который вынуждает 403 вместо 401. Но как быть с противоположным? Как я могу заставить apache повторно запросить логин и пароль в случае неудачной авторизации?

Редактировать: Я посмотрел журнал отладки прямо сейчас. Дело в том, что если я введу только Требуется действительный пользователь в разделе RequireAll , в журнале я вижу "отказано (пользователь еще не авторизован)" ,Тем не менее, если я добавлю Require env SMTH дополнительно, apache проверит Требуется действительный пользователь , но затем, после сбоя с "denied (еще не авторизован пользователь)" , он также проверит мой второй Require и потерпит неудачу только с "denied" и выдаст HTTP 403. Я думаю, что это ошибка. Почему apache проверяет наличие второго Require в RequireAll, если первое уже не удалось?

Edit2: Похоже, оно еще не было реализовано: https://github.com/apache/httpd/blob/trunk/modules/aaa/mod_authz_core.c#766

if (child_result != AUTHZ_NEUTRAL) {
                /*
                 * Handling of AUTHZ_DENIED/AUTHZ_DENIED_NO_USER: Return
                 * AUTHZ_DENIED_NO_USER if providing a user may change the
                 * result, AUTHZ_DENIED otherwise.
                 */
                if (section->op == AUTHZ_LOGIC_AND) {
                    if (child_result == AUTHZ_DENIED) {
                        auth_result = child_result;
                        break;
                    }
                    if ((child_result == AUTHZ_DENIED_NO_USER
                         && auth_result != AUTHZ_DENIED)
                        || (auth_result == AUTHZ_NEUTRAL)) {
                        auth_result = child_result;
                    }
                }
                else {
                    /* AUTHZ_LOGIC_OR */
                    if (child_result == AUTHZ_GRANTED) {
                        auth_result = child_result;
                        break;
                    }
                    if ((child_result == AUTHZ_DENIED_NO_USER
                         && auth_result == AUTHZ_DENIED)
                        || (auth_result == AUTHZ_NEUTRAL)) {
                        auth_result = child_result;
                    }
                }
            }
...