2016-05-03 3 views
0

Я реализую страницу входа с AngularJS для аутентификации на сервере LDAP. Аутентификация на задней панели выполняется Spring Security. В основном имя пользователя и пароль отправляются на сервер через почтовый запрос, который обрабатывается Spring без явного обработчика.AngularJS: как разобрать ответ 302

Когда я отправляю форму для входа, почтовый запрос возвращает 302 и перенаправляет на другой URL-адрес на основании того, являются ли учетные данные действительными или нет. Если пароль верен, он инициирует запрос GET на «http://localhost:8080/». Если пароль неверен, он перенаправляется на «http://localhost:8080/login?error». Это известное поведение Spring Security. Согласно Dave Syer's article, «поведение по умолчанию Spring Security - отправить 302 на успех и сбой, а Angular будет следовать перенаправлению, поэтому нам придется фактически анализировать ответ от этого». В учебнике Dave он использовал вспомогательную функцию для проверки подлинности в общем случае. Я не думаю, что это будет работать для аутентификации LDAP.

Я нашел еще один очень похожий пост Spring Boot and Security with custom AngularJS Login page. Хотя он не имеет официального ответа, основываясь на последнем комментарии, кажется, что изменение путей в .antMatchers в конфигурации Java может решить проблему. Однако я играл с моей конфигурацией безопасности (см. Ниже) взад и вперед, и это, похоже, не помогло.

protected void configure(HttpSecurity http) throws Exception { 
    http 
     .httpBasic().and() 
     .addFilterBefore(new CORSFilter(), ChannelProcessingFilter.class) 
     .csrf().disable() 
     .authorizeRequests() 
     .antMatchers("/login/", "/login","login/") 
     .permitAll() 
      .anyRequest() 
      .authenticated() 
     .and() 
     .formLogin(); 
} 

Хотя 302 не дает никакого ответа, клиент каким-то образом знает, какие URL для перенаправления на основе действия учетных данных в. Мое понимание заключается в том, что сервер должен был сообщить клиенту, что аутентификация выполнена успешно или нет «секретным» способом. Если я захвачу и проанализирую эту скрытую информацию до того, как клиент отправит запрос GET, я могу сделать работу по аутентификации с помощью Angular. Что-то вроде этого (частично псевдокода):

app.controller("LoginCtrl", ['$scope', '$location', 
function($scope, $location){ 
    $scope.authenticate = function() { 
     loginFactory.login($scope.username, $scope.password) { 
     // pseudo code starts 
     if (redirect.path == 'localhost') { 
      $location.path('/main'); 
     } 
     else { 
      $location.path('/loginfail'); 
      console.log("Login failed"); 
     } 
    } 
}]); 

Вопрос заключается в том, чтобы диагностировать 302 и определить характер ответа, прежде чем происходит редирект? В худшем случае, я мог позволить перенаправлению начать, и захватить response.path из запроса GET и решить, будет ли логин успешным. Но я стараюсь не идти по этому пути. Нехорошее предложение.

ответ

0

После долгих поисков Google я нашел способ подавить 302 и таким образом избежать перенаправления на основе этого article. Резолюция заключается в том, чтобы внедрить специальный обработчик успеха проверки подлинности в фильтр входа в форму и SimpleUrlAuthenticationFailureHandler для обработки неудачной аутентификации.

Смежные вопросы