Отладка 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:

http://www.redmine.org/issues/16948

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