2016-05-03 61 views
0

我正在實現一個登錄頁面,使用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並決定登錄是否成功。但我儘量不要走這條路。需要嚴重的建議。

回答

0

經過數小時的谷歌搜索,我找到了一種方法來抑制302,從而避免重定向基於此article。解決方案是在表單登錄過濾器中注入自定義身份驗證成功處理程序,並處理失敗的身份驗證。