Printemps de Démarrage et de Sécurité personnalisé avec AngularJS page de Connexion

Je me suis mise en œuvre d'une coutume AngularJS page de connexion pour le Printemps de Sécurité, et je vais avoir des problèmes d'authentification.

Je suis en suivant ce tutoriel/exemple, et leur exemple fonctionne très bien en local: https://github.com/dsyer/spring-security-angular/tree/master/single

Cependant, lorsque j'essaie de mettre en œuvre cette moi-même, je ne suis pas en mesure de s'authentifier, et je ne suis pas sûr de savoir où est mon erreur est.

Un POST est fait à /de connexion avec les informations d'identification, (la boucle est identique à l'exemple), et je reçois un 302 Found avec une redirection pour OBTENIR /login/, qui renvoie un 404 not Found.

Quand j'essaie de POSTER /login, le Printemps ne génère pas de tous les journaux de débogage, donc je ne suis pas sûr de savoir comment c'est de servir le 302.

Mon code peut être trouvé ici: https://github.com/AndrewBell/spring-angular-starter/tree/master

Changements notables (Et probablement la source de mes problèmes):

  • Fichier modifications de la structure

  • Utilisant strictement Angulaire (Sans jQuery) - Qui résulte dans une autre fonction nécessaire de faire la demande POST

  • À l'aide de verdure au lieu de wro4j

  • Angulaire code style/portée du

Plusieurs Printemps des questions de Sécurité suggèrent la requête POST est correctement mise en forme, mais le mien semble être le même que l'exemple (au moins, quand je copie curl en chrome dev console). D'autres suggèrent la mise en œuvre personnalisée, fournisseurs d'autorisation, mais il n'est pas nécessaire dans l'exemple, donc je suis perplexe à ce qu'est la différence entre la mine et l'exemple. M'aider Stack Exchange, vous êtes mon seul espoir.

Outils de Dev: imgurDOTcom/a/B2KmV

Code:

login.js

JS:

'use strict';
angular
.module('webApp')
.controller('LoginCtrl', ['$root`enter code here`Scope', '$scope', '$http', '$location', '$route', function($rootScope, $scope, $http, $location, $route) {
console.log("LoginCtrl created.");
var vm = this;
vm.credentials = {
username: "",
password: ""
};
//vm.login = login;
$scope.tab = function(route) {
return $route.current && route === $route.current.controller;
};
var authenticate = function(callback) {
$http.get('user').success(function(data) {
console.log("/user success: " + JSON.stringify(data));
if (data.name) {
console.log("And Authenticated!");
$rootScope.authenticated = true;
} else {
console.log("But received invalid data.");
$rootScope.authenticated = false;
}
callback && callback();
}).error(function(response) {
console.log("/user failure." + JSON.stringify(response));
$rootScope.authenticated = false;
callback && callback();
});
};
authenticate();
$scope.login = function() {
var data2 = 'username=' + encodeURIComponent(vm.credentials.username) +
'&password=' + encodeURIComponent(vm.credentials.password);
$http.post('login', data2, {
headers : {
'Content-Type': 'application/x-www-form-urlencoded'
}
}).success(function() {
authenticate(function() {
if ($rootScope.authenticated) {
console.log("Login succeeded");
$location.path("/");
$scope.error = false;
$rootScope.authenticated = true;
} else {
console.log("Login failed with redirect");
$location.path("/login");
$scope.error = true;
$rootScope.authenticated = false;
}
});
}).error(function() {
console.log("Login failed");
$location.path("/login");
$scope.error = true;
$rootScope.authenticated = false;
})
};
$scope.logout = function() {
$http.post('logout', {}).success(function() {
$rootScope.authenticated = false;
$location.path("/");
}).error(function() {
console.log("Logout failed");
$rootScope.authenticated = false;
});
}
}]);

application.java

package com.recursivechaos.springangularstarter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.csrf.CsrfFilter;
import org.springframework.security.web.csrf.CsrfToken;
import org.springframework.security.web.csrf.CsrfTokenRepository;
import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.WebUtils;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.security.Principal;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RequestMapping("/user")
public Principal user(Principal user) {
return user;
}
@RequestMapping("/resource")
public Map<String, Object> home() {
Map<String, Object> model = new HashMap<>();
model.put("id", UUID.randomUUID().toString());
model.put("content", "Hello World");
return model;
}
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.
formLogin().
//loginPage("/#/login").
and().
logout().
and().
authorizeRequests().
antMatchers("/index.html", "/home/**", "/login/**", "/bower_components/**", "/", "/main.js", "/login/", "/navigation/**","/login","login/","/login.html").
permitAll().
anyRequest().
authenticated().
and().
csrf().
csrfTokenRepository(csrfTokenRepository()).
and().
addFilterAfter(csrfHeaderFilter(), CsrfFilter.class);
}
private Filter csrfHeaderFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class
.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null || token != null
&& !token.equals(cookie.getValue())) {
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
};
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
}
}
  • Si vous redirigé vers /login cela signifie que vous n'êtes pas authentifié (mais il ne devrait pas être une erreur 404, donc c'est bizarre). Vous pouvez activer la journalisation du débogage pour org.springframework.security pour obtenir des informations plus détaillées sur l'accès à la décision (j'attends les informations d'identification ont été mauvais, d'une certaine façon), comme par exemple logging.level.org.springframework.security=DEBUG dans application.[properties,yml].
  • En regardant à travers les journaux, je n'arrive pas à même de voir un POST /login Comment puis-je vérifier que le Printemps est de la manipulation POST /login? pastebin.com/GeUkCUvg
  • Il semble être un problème de chemin d'accès (ou éventuellement le champ d'application), comme je l'ai été en mesure de tirer votre "simple" projet de l'github exemples, retirez le wro4j, et de la remplacer par la suivante bower dépendances: "angulaire": "^1.3.0", "angulaires-ressource": "^1.3.0", "angulaires-bootstrap": "~0.12.0", "bootstrap css-only": "~3.3.2", "angulaire de l'itinéraire": "~1.3.11" Et à l'aide de... var req = 'username=' + ($champ d'application.les informations d'identification.nom d'utilisateur) + =' + ($champ d'application.les informations d'identification.le mot de passe); $http.post('login', req..... Semble bien fonctionner
  • Je ne peux pas voir un POST /login mais le journal semblait à la fin du moyen de chargement de la page d'accueil. Êtes-vous sûr que votre client a effectivement envoyé un POST de toute façon (vous pouvez voir que dans le client, et ce sont la demande/en-têtes de réponse)?
  • OK, la 404 est évident: votre client est l'envoi d'un GET pour /login/ laquelle vous avez déclaré être permitAll() mais n'ont pas fourni une vue pour. Spring Security fournit une whitelabel vue /login (pas de slash), et il envoie seulement /login 302 réponses, de sorte que votre client se comporte plutôt étrange.
  • Merci pour l'aide @DaveSyer, d'être plus conscient de ce que j'ai sur le permitAll(), et de vérifier les chemins d'accès résolu le problème!

InformationsquelleAutor Andrew | 2015-02-11