2015-02-11 3 views
12

Я реализую пользовательскую страницу входа в систему AngularJS для Spring Security, и у меня возникают проблемы с аутентификацией.Весенняя загрузка и безопасность с пользовательской страницей регистрации AngularJS

Я следую за этот учебник/пример, и их пример отлично работает локально: https://github.com/dsyer/spring-security-angular/tree/master/single

Однако, когда я пытаюсь реализовать это сам, я не в состоянии проверить подлинность, и я не уверен, где моя ошибка есть.

POST сделана для входа/входа с учетными данными, (завиток идентичен примеру), и я получаю 302 Найдено с перенаправлением на GET/login /, который возвращает 404 Not Found.

Когда я пытаюсь POST к/входа в систему, Spring не создает каких-либо журналов отладки, поэтому я не знаю, как она обслуживает 302.

Мой код можно найти здесь: https://github.com/AndrewBell/spring-angular-starter/tree/master

Заметные изменения (и, скорее всего источник моих вопросов):

  • структура файла изменяет

  • Использование не строго Угловое (без JQuery) - Какие результаты в другой функции, необходимые, чтобы сделать запрос POST

  • Использование беседку вместо wro4j

  • Угловая код для укладки/обзорного

Многие связанные Вопросы Spring Security указывают, что запрос POST отформатирован некорректно, но мой, по-видимому, такой же, как в примере (по крайней мере, когда я копирую в curl в консоли Chrome chrome). Другие предлагают внедрение специализированных поставщиков авторизации, но в этом примере это не нужно, поэтому я озадачен тем, что разница между моим и примером. Помогите мне в Stack Exchange, вы - моя единственная надежда.

Dev Tools: imgurDOTcom/а/B2KmV

Соответствующий код:

login.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; 
     } 
    } 

} 
+0

Если вы перенаправлены на/login, это означает, что вы не прошли аутентификацию (но это не должно быть 404, так что это нечетно). Вы можете включить ведение журнала отладки для 'org.springframework.security', чтобы получить более подробную информацию о решении о доступе (я ожидаю, что учетные данные были плохими в некотором роде), например. установите 'logging.level.org.springframework.security = DEBUG' в' application. [properties, yml] '. –

+0

@DaveSyer Просматривая журналы, я не могу даже видеть POST для входа/входа Как я могу проверить, что Spring обрабатывает POST/login? http://pastebin.com/GeUkCUvg – Andrew

+1

Это, по-видимому, проблема пути (или, возможно, область), поскольку я смог вытащить ваш «единственный» проект из примеров github, удалить wro4j и заменить следующим Bower зависимости: "угловое": "^ 1.3.0", "угловой ресурс": "^ 1.3.0", "угловая самозагрузка": "~ 0.12.0", "самозагрузка-CSS-только": "~ 3.3.2", "углового-маршрут": "~ 1.3.11" И используя ... var req = 'username =' + ($ scope.credentials.username) + = '+ ($ scope.credentials.password); $ http.post («Войти», REQ .... Кажется, работает отлично – Andrew

ответ

0

Попробуйте добавить WebSecuritConfigAdapter

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity httpSecurity) throws Exception { 
     httpSecurity 
      .authorizeRequests() 
      .antMatchers("/**").permitAll() 
      .anyRequest().authenticated(); 
    } 
} 
0

Существует одна вещь worng с login.js, что он вызывает authenticate(), который вызывает/пользователя, и вы получите перенаправление на GET/логин /. Spring ищет login.jsp, которого нет и в итоге 404 не найдено.

Вы можете заставить его работать, принимая следующие шаги:

1) Удалить вызов authenticate() из линии 38 в login.js

2) Добавить обработки Войти URL как:

http. 
    formLogin(). 
    loginProcessingUrl("/perform_login"). 
    and(). 
    logout() 
.... 

3) Измените свой логин на «perform_login» следующим образом:

$http.post('perform_login', data2, { 
      headers : { 
       'Content-Type': 'application/x-www-form-urlencoded' 
      } 
     }).... 

, и он работает, вы получаете пользователя.

См. http://www.baeldung.com/spring-security-login для конфигурации весны.