2017-10-17 1 views
0

J'ai la configuration de sécurité suivante avec Spring 3,2

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

Je suis arrivé à la conclusion que defaultSuccessUrl() et failureUrl() a été effectuée, la page liée chargée mais n'a pas tenu compte AngularJS frontend avec ng route/emplacement $.

J'ai une seule page Application sur index.html avec a le bloc ng-vue suivante, il est essentiellement un panneau d'amorçage Nav avec un bouton de connexion:

<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> 

Une page de connexion serait affiché sur ng bloc -view, et je l'ai fonction ng-clic() qui introduisent la forme à la fonction javascript suivante:

$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(); 
      }); 

la page aurait un comportement différent en fonction de la réussite/échec de connexion, mais néanmoins retourner un code d'état de 200/302/304, que javascript a considéré comme un succès. Le formulaire de connexion resterait également dans le bloc, en négligeant Java Success Handler. La page a demandé le html défini dans defaultSuccessUrl(), mais il n'a pas été affiché sur la page.

Je ne pouvais que coder $ location.path ("/") après le succès de la connexion (premier rappel de javascript), et forcer l'utilisateur à se connecter avant d'accéder à n'importe quelle page.

+0

avez-vous été en mesure de résoudre ce problème? Je suis confronté au même problème. – Med

Répondre

0

Je pense que vous ne pouvez pas utiliser Spring Securitys defaultSuccessUrl ici. Le contrôle du flux Web doit être sur le client. Jetez un oeil à la official example, ils font la même chose.

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; 
     } 
     }); 
    }; 
});