我正在實現一個登錄頁面,使用AngularJS對LDAP服務器進行身份驗證。後端的認證由Spring Security完成。基本上,用戶名和密碼通過一個由Spring處理的post請求發送到服務器,而不需要顯式的處理器。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。雖然它沒有正式答案,但基於最後一條評論,似乎修改了在Java配置中的.antMatchers
路徑可能已經解決了這個問題。然而,我用我的安全配置(見下面)來回玩,似乎沒有幫助。
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不產生任何響應,客戶不知何故知道重定向到基於證書的有效性,其網址。我的理解是,服務器必須告訴客戶端身份驗證是否成功,或者不是以「祕密」的方式。如果我在客戶端發送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,並確定重定向發生之前回應的性質是什麼?在最壞的情況下,我可以讓重定向開始,並從GET請求中獲取response.path
並決定登錄是否成功。但我儘量不要走這條路。需要嚴重的建議。