Отладка Apache 2.4 PerlAuthenHandler
Я пытаюсь отладить проблему, которая произошла после обновления apache. Я хочу интегрировать Redmine в мою аутентификацию apache / контроль доступа.
Вот мой конфиг apache:
<Location "/git/">
AuthType Basic
AuthName "Git Access"
Require valid-user
Order deny,allow
Allow from all
PerlAccessHandler Apache::Authn::Redmine::access_handler
PerlAuthenHandler Apache::Authn::Redmine::authen_handler
...
И это обработчик доступа / аутентификации:
sub access_handler {
my $r = shift;
unless ($r->some_auth_required) {
$r->log_reason("No authentication has been configured");
return FORBIDDEN;
}
return OK unless request_is_read_only($r);
my $project_id = get_project_identifier($r);
$r->log_error("Setting Auth to OK") if is_public_project($project_id, $r) && anonymous_role_allows_browse_repository($r);
$r->log_error("Content: " . $r->get_handlers("PerlAuthenHandler"));
$r->set_handlers(PerlAuthenHandler => [\&ok_authen_handler])
if is_public_project($project_id, $r) && anonymous_role_allows_browse_repository($r);
return OK
}
sub ok_authen_handler {
my $r = shift;
$r->log_error("ok_authen_handler()...");
my ($res, $redmine_pass) = $r->get_basic_auth_pw();
return OK;
}
sub authen_handler {
my $r = shift;
$r->log_error("authen_handler() ...");
my ($res, $redmine_pass) = $r->get_basic_auth_pw();
return $res unless $res == OK;
if (is_member($r->user, $redmine_pass, $r)) {
$r->log_error("Auth succeeded");
return OK;
} else {
$r->log_error("Auth failed...");
$r->note_auth_failure();
return DECLINED;
}
}
Как вы можете видеть, обработчик доступа сбрасывает обработчик аутентификации в некоторый фиктивный метод, если аутентификация не требуется. Теоретически это позволяет выборочно анонимный доступ.
На практике, хотя apache 2.4 выдает ошибку:
AH00027: No authentication done but request not allowed without authentication for $PATH. Authentication not configured?
Я уже прибил проблему к хаку в обработчике доступа, если я раскомментирую оператор set_handlers, я могу аутентифицироваться против redmine. Так что я думаю, что-то не так в этом "хаке". К сожалению, я на самом деле не Perl парень, поэтому я не знаю, как исследовать проблему дальше.
Есть ли способ выяснить, в чем заключается важное различие между "взломанным" потоком управления (т.е. программной установкой обработчика аутентификации) и обычным?
2 ответа
Немного грязный обходной путь - всегда устанавливать переменную "user" (REMOTE_USER) даже в анонимном режиме, поэтому "Require valid-user" кажется счастливым,
$r->user("");
return Apache2::Const::OK;
У нас была эта проблема для реализации отложенной аутентификации (стиль Шибболет).
Я недавно обновился с 2.3 до 2.5.1. Теперь у меня такое же странное поведение, пока проект публичный. У меня есть несколько проектов, где другим нужен доступ без регистрации на сайте Redmine. Поэтому мне нужно быстрое решение. Но я также не знаю, как это решить. Поэтому я создал отчет об ошибке на стороне проекта Redmine: