2016-05-03 3 views
0

AngularJSを使用してLDAPページに対して認証するログインページを実装しています。バックエンドでの認証は、Spring Securityによって行われます。基本的にユーザ名とパスワードは、明示的なハンドラなしでSpringが処理する投稿要求を介してサーバに送られます。AngularJS:302の応答を解析する方法

ログインフォームを送信すると、投稿要求は302を返し、資格情報が有効かどうかに基づいて別のURLにリダイレクトされます。パスワードが正しければ、 "http://localhost:8080/"へのGET要求を開始します。パスワードが間違っていると、 "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 configの.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は、任意の応答を生成しませんが、クライアントは何とか資格の有効性に基づいてするリダイレクト先の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を診断し、リダイレクトが発生する前に応答の性質を特定する方法ですか?最悪のシナリオでは、リダイレクトを開始させ、GET要求からresponse.pathを取得し、ログインが成功したかどうかを判断できます。しかし、私はその道を歩かないようにしています。間違った提案が必要です。

答えて

0

Google検索の時間がたってから、私は302を抑制して、articleに基づくリダイレ​​クトを避ける方法を見つけました。解決方法は、カスタム認証成功ハンドラをフォームのログインフィルタに挿入し、SimpleUrlAuthenticationFailureHandlerを使用して失敗した認証を処理することです。