Я реализую страницу входа с 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 и решить, будет ли логин успешным. Но я стараюсь не идти по этому пути. Нехорошее предложение.