2016-02-01 6 views
2

У меня есть приложение загрузки весны и вы хотите войти в него через мой сервис angularJS. Я зарегистрировался через почтальон, который сохраняет cookie в моем браузере, но я хочу снова войти в систему, используя мой сервис. Из-за моего cookie я могу вызвать любые контроллеры в моем загрузочном приложении весны (все они требуют аутентификации). Но все попытки входа в систему не выполняются с ошибкой «Unauthorized». Полный браузер консольного вывод - POST http://localhost:3344/bl/login 401 (Несанкционированный)

конфигурация

безопасности для весны (я расширяю WebSecurityConfigurerAdapter):

@Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.jdbcAuthentication() 
       .dataSource(dataSource) 
       .passwordEncoder(passwordEncoder()) 
       .usersByUsernameQuery(USERS_BY_USERNAME_QUERY) 
       .authoritiesByUsernameQuery(AUTHORITIES_BY_USERNAME_QUERY); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable() 
        .exceptionHandling() 
        .authenticationEntryPoint(restAuthenticationEntryPoint) 
        .and() 
       .authorizeRequests() 
        .antMatchers("/").authenticated() 
        .and() 
       .formLogin() 
        .loginProcessingUrl("/bl/login") 
        .usernameParameter("user") 
        .passwordParameter("pass") 
        .successHandler(authenticationSuccessHandler) 
        .failureHandler(new SimpleUrlAuthenticationFailureHandler()) 
        .and() 
       .logout() 
        .logoutUrl("/logout") 
        .invalidateHttpSession(true); 
    } 

Моего Угловое обслуживание довольно просто:

loginModule.factory('loginService', function($http) { 
    return { 
    login: function(username, password) { 
     $http.post('/bl/login', {user: 'admin', pass: 'admin'}).then(
     function(response) { 
      window.alert('success') 
     }, 
     function(response){ 
      window.alert('fail') 
     }); 
    } 
    }; 
}); 

Я также создал контроллер как услуга входа «mock» для проверки моего углового кода:

@RequestMapping(value ="/bl/login2", produces="application/json") 
    JSONResponse login(@RequestBody LoginCreds credentials) { 

    return new JSONResponse("logged in " + credentials.getUser()); 
    } 

Этот контроллер работает, и я вижу, что мой логин и пароль переданы правильно, и я возвращаю ответ к моему угловому сервису. LoginCreds содержит 2 строки 'user' и 'pass'. JSONResponse содержит одну строку.

+0

Возможно, это может помочь https://spring.io/blog/2015/01/12/the-login-page-angular-js-and-spring-security-partiiii – sodik

ответ

3

Решил, проблема заключалась в том, что в моей конфигурации с пружиной у меня есть «formLogin()», что означает, что мне нужно изменить заголовок типа контента в моем запросе от угловой службы до «application/x-www-form-urlencoded», , И сериализуйте данные соответствующим образом. This link explains it with examples.

Мой конечный результат выглядит следующим образом:

 var req = { 
     method: 'POST', 
     url: 'bl/login', 
     headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, 
     data: $.param({ user: username, pass: password }), 
     }; 

     $http(req).then(
     function(response) { 
      window.alert('success') 
     }, 
     function(response){ 
      window.alert('fail') 
     }); 
     } 

Поскольку угловая сериализация данные в формат JSON по умолчанию, мы должны использовать $ .param() функцию для сериализации.

+0

Спасибо! Это очень помогло мне. – papacito

Смежные вопросы