2017-10-17 22 views
0

は私がdefaultSuccessUrl()とfailureUrl()が実行された結論、関連ページロードを得たが、NG-ルート/ $場所でAngularjsフロントエンドで無視された春3.2

.formLogin() 
      .loginPage("/login.html") 
      .usernameParameter("username").passwordParameter("password") 
      .loginProcessingUrl("/perform_login") 
      .defaultSuccessUrl("/welcome", false) 
      .failureUrl("/notexistpage") 

と、次のセキュリティコンフィグを持っています。

私はindex.htmlの上で単一ページのアプリケーションを持っているが、以下のNG-ビューブロックを持っている、それは基本的には、ログインボタンを押して、ブートストラップナビゲーションパネルです:

<li class="nav-item" ng-show="!authenticated"> 
         <a class="nav-link active" id="login-tab" data-toggle="tab" role="tab" aria-controls="login" aria-expanded="true" href="#!/login">Login</a> 
        </li> 

<div ng-view class="container"></div> 

ログインページがNGに表示されます次のJavaScript関数にフォームを送信-viewブロック、およびIきngのクリック()関数:

$http({ 
       method: 'POST', 
       url: 'perform_login', 
       headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
       transformRequest: function(obj) { 
        var str = []; 
        for(var p in obj) 
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
        return str.join("&"); 
       },    
       data: credentials 
      }).then(function (response) { 
       $rootScope.authenticated = true;     
       callback && callback(); 
      }, function (response) { 
       $rootScope.authenticated = false;     
       callback && callback(); 
      }); 

ページには、/ログインに失敗し、成功に応じて、異なる動作をしますが、それにもかかわらず、200のステータスコードを返します/ 302/304、これはjavascriptが成功とみなしたものです。また、ログインフォームはブロック内に残り、Java Success Handlerは無視されます。ページはdefaultSuccessUrl()で定義されたhtmlを要求しましたが、ページに表示されませんでした。

ログイン成功後(javascriptの最初のコールバック)に$ location.path( "/")のみをハードコードし、任意のページにアクセスする前にユーザーにログインさせることができます。

+0

これを修正できましたか?私は同じ問題に直面しています。 – Med

答えて

0

ここでは、Spring Securitys defaultSuccessUrlは使用できないと思います。 ウェブフローの制御はクライアント上になければなりません。 official exampleを見て、彼らは同じことをやっている。

angular.module('hello', [ 'ngRoute' ]) // ... omitted code 
.controller('navigation', 

    function($rootScope, $http, $location) { 

    var self = this 

    var authenticate = function(credentials, callback) { 

    var headers = credentials ? {authorization : "Basic " 
     + btoa(credentials.username + ":" + credentials.password) 
    } : {}; 

    $http.get('user', {headers : headers}).then(function(response) { 
     if (response.data.name) { 
     $rootScope.authenticated = true; 
     } else { 
     $rootScope.authenticated = false; 
     } 
     callback && callback(); 
    }, function() { 
     $rootScope.authenticated = false; 
     callback && callback(); 
    }); 

    } 

    authenticate(); 
    self.credentials = {}; 
    self.login = function() { 
     authenticate(self.credentials, function() { 
     if ($rootScope.authenticated) { 
      $location.path("/"); 
      self.error = false; 
     } else { 
      $location.path("/login"); 
      self.error = true; 
     } 
     }); 
    }; 
}); 
関連する問題