2016-05-03 14 views
0

Ich implementiere eine Login-Seite mit AngularJS zur Authentifizierung gegen LDAP-Server. Die Authentifizierung am Backend erfolgt durch Spring Security. Grundsätzlich werden Benutzername und Passwort über eine Post-Anfrage, die von Spring ohne einen expliziten Handler bearbeitet wird, an den Server gesendet.AngularJS: Wie antworte ich Antwort von 302

Wenn ich das Login-Formular abschicke, gibt die Post-Anfrage 302 zurück und leitet auf eine andere URL um, je nachdem, ob die Zugangsdaten gültig sind oder nicht. Wenn das Passwort korrekt ist, wird eine GET-Anfrage an "http://localhost:8080/" ausgelöst. Wenn das Passwort falsch ist, wird es auf "http://localhost:8080/login?error" umgeleitet. Dies ist ein bekanntes Verhalten von Spring Security. Laut Dave Syer's article, "das Spring Security-Standardverhalten ist eine 302 bei Erfolg und Fehler zu senden, und Angular folgen der Umleitung, so dass wir die Antwort tatsächlich von diesem analysieren müssten". In Daves Tutorial verwendete er eine Hilfsfunktion, um die Authentifizierung im allgemeinen Fall zu verifizieren. Ich glaube nicht, dass es für die LDAP-Authentifizierung funktionieren würde.

Ich fand einen anderen sehr ähnlichen Beitrag Spring Boot and Security with custom AngularJS Login page. Obwohl es auf der Grundlage des letzten Kommentars keine offizielle Antwort gibt, scheint es, dass das Ändern von Pfaden in .antMatchers in der Java-Konfiguration das Problem gelöst haben könnte. Allerdings spielte ich mit meiner Sicherheitskonfiguration (siehe unten) hin und her und es schien nicht zu helfen.

Obwohl 302 keine Antwort erzeugt, weiß der Client irgendwie, auf welcher URL er basierend auf der Gültigkeit der Berechtigung umleiten soll. Nach meinem Verständnis muss der Server dem Client mitgeteilt haben, ob die Authentifizierung erfolgreich ist oder nicht "geheim". Wenn ich diese versteckten Informationen erfassen und analysieren, bevor der Client die GET-Anforderung sendet, könnte ich die Authentifizierung mit Angular durchführen. So etwas wie dieser (teilweise Pseudocode):

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

Die Frage ist, wie die 302 zu diagnostizieren und die Art der Reaktion zu identifizieren, bevor Umleitung geschieht? Worst-Case-Szenario, könnte ich die Umleitung zu starten, und greifen response.path von der GET-Anfrage und entscheiden, ob die Anmeldung erfolgreich ist. Aber ich versuche, diesen Weg nicht zu gehen. Brauche dringend einen Vorschlag.

Antwort

0

Nach Stunden der Google-Suche, fand ich eine Möglichkeit, die 302 zu unterdrücken und damit Umleitungen basierend auf dieser article zu vermeiden. Die Lösung besteht darin, einen benutzerdefinierten Authentifizierungserfolgshandler im Formularanmeldefilter und SimpleUrlAuthenticationFailureHandler für fehlgeschlagene Authentifizierung einzugeben.

Verwandte Themen