2015-09-07 6 views
0

Я использую Угловой в передней панели и ручку безопасности с пружиной безопасности в бэкэнде.Весна безопасности & Угловая

Однако Spring sec не аутентифицирует пользователя. Для действительных и недействительных учетных данных это поведение одинаково. Я хочу поймать «плохие учетные данные» для неверного пользователя или пароля и данных пользователя для действительных учетных данных. Какова моя проблема и как я могу ее обработать? Спасибо

пружина безопасности конфигурации

@Bean 
public BCryptPasswordEncoder passwordEncoder() { 
    return new BCryptPasswordEncoder(); 
} 

@Bean 
public JdbcUserDetailsManager userDetailsManager(AuthenticationManager authenticationManager, DataSource dataSource) { 
    JdbcUserDetailsManager userDetailsService = new JdbcUserDetailsManager(); 
    userDetailsService.setDataSource(dataSource); 
    userDetailsService.setAuthenticationManager(authenticationManager); 
    return userDetailsService; 
} 

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

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().antMatchers("/webjars/**", "/resources/**", "/js/**", "/public/**"); 
} 

@Override 
@Bean 
public AuthenticationManager authenticationManagerBean() throws Exception { 
    return super.authenticationManagerBean(); 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception {   
    http 
      .authorizeRequests().antMatchers("/login").permitAll().and() 
      .authorizeRequests().antMatchers("/index").permitAll().and() 

      .authorizeRequests().anyRequest().hasRole("USER").and() 
      .exceptionHandling() 
      .accessDeniedPage("/index?authorization_error=true") 
      .and() 

      .csrf() 
      .csrfTokenRepository(csrfTokenRepository()) 
      .requireCsrfProtectionMatcher(new AntPathRequestMatcher("/oauth/authorize")).disable() 
      .addFilterAfter(csrfHeaderFilter(), CsrfFilter.class) 

      .logout() 
      .logoutSuccessUrl("/index") 
      .logoutUrl("/logout.do") 
      .and() 

      .formLogin() 
      .usernameParameter("j_username") 
      .passwordParameter("j_password") 
      .failureUrl("/index?authentication_error=true") 
      .loginPage("/index") 
      .loginProcessingUrl("/j_security_check") 
      .and() 

      .sessionManagement().maximumSessions(1); 
} 

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

}

Угловая контроллер:

 var loginService = function() { 
     var deferred = $q.defer(); 
     $http.post(contextPath + '/j_security_check', {j_username: $scope.credentials.j_username, j_password: $scope.credentials.j_password}). 
      success(function (data) { 
       deferred.resolve(data); 
      }). 
      error(function (data, status, header, config) { 
       $log.warn(data, status, header(), config); 
       deferred.reject(status); 
      }); 
     return deferred.promise; 
    }; 
    $scope.login = function() { 
     loginService().then(function (result) { 
      console.log(result); 
      $state.go('dashboard'); 
     }, function (result) { 
      switch (result) { 
       case 401: 
        $scope.message = "Error " + result + ": username or password is not correct"; 
        break; 
       case 403: 
        $scope.message = "Error " + result + ": username or password is not correct"; 
        break; 
       default : 
        $scope.message = "Error " + result + " :unknown error"; 
      } 
     }) 
    }; 

Спасибо

ответ

2

UPDATE:

Проверить Тхи s аналогичный SO вопрос, который имеет пример angularjs http-перехватчика, получающий непосредственно csrf params и добавляющий в заголовки во всех запросах.

ПРИЧИНА по умолчанию angularJS не работает, как упомянуто в link

По умолчанию AngularJS обеспечивает механизм реализации Cross Site Request Подделка, однако этот механизм работает только с печеньем. Поскольку Spring Security работает, установив токен в качестве параметра HTTP, решение, выпущенное в автономном режиме, не будет работать.

Как упомянуто в документации spring-security-csrf-token-interceptor проекта - «An AngularJS перехватчик, который устанавливает маркер информации о Spring Security CSRF во всех запросах HTTP» - это работает, делая голову вызов получить X-CSRF-токен, его затем сохраняет этот токен и отправляет его с каждым HTTP-запросом.

Описание: Добавьте угловой перехватчик, упомянутый в вышеупомянутом проекте, чтобы исправить ваш случай. Проверьте образец, упомянутый в этом проекте github.

+0

спасибо, что это мне действительно помогает. теперь я могу войти в систему. но мне нужны мои пользовательские данные, такие как его роль, как я могу отправить эти данные вместо «ok» в ответ – farhad

+0

, вы имеете в виду после входа в систему, вам нужна роль пользователя в ответе? я не вижу в вашем коде, где вы предоставляете ROLE_USER зарегистрированному пользователю. –

+0

yes, your're right, но если я хочу получить доступ к данным пользователя, таким как имя, адрес электронной почты, ... как я могу обращаться с этим – farhad

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