2016-10-06 4 views
0

В моей конфигурации, я определил, что:Spring Security hasIpAddress вызывает ошибки

@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true) 

И со следующим кодом:

http.exceptionHandling() 
      .authenticationEntryPoint(authEntryPoint) 
      .and() 
      .authorizeRequests() 
      .antMatchers("/api/payment").permitAll() 
      //.antMatchers("/api/payment").hasIpAddress("XXX.XXX.X.XX") 
... 

Теперь, когда я разрешенное весь трафик «/ API/платеж ", все выполняется.

Однако, если я пытаюсь включить IP проверки:

http.exceptionHandling() 
      .authenticationEntryPoint(authEntryPoint) 
      .and() 
      .authorizeRequests() 
      //.antMatchers("/api/payment").permitAll() 
      .antMatchers("/api/payment").hasIpAddress("XXX.XXX.X.XX") 
... 

запрашивает передачу с данного IP-адрес получен следующий ответ:

{"errorMessage":"Not Found","errorId":"6ae34aa3-9195-42d6-8906-996906988ce0","errorDetails":null} 

Что я делаю неправильно?

EDIT

Это метод, который я вызов:

@RequestMapping(value = "/payment", method = POST) 
public String saveOrder(@ModelAttribute PaymentDto paymentDto) { 
    paymentService.savePayment(paymentDto); 
    return "OK"; 
} 

Поскольку я всегда посылаю данные запроса (например, пост по следующей ссылке: api/payment?id=123&whatever)

Я добавил:

.antMatchers("/api/payment?**").access("hasIpAddress('XXX.XXX.X.XX')") 

Но это не сработало.

UPDATE 2

Я изменил размещение моего antMatcher так:

http.exceptionHandling() 
     .authenticationEntryPoint(authEntryPoint) 
     .and() 
     .authorizeRequests() 
     .antMatchers("/", "/app/**", "/assets/**", "/fonts/**", "/images/**").permitAll() 
     .antMatchers("/authentication/login", "/login.html").anonymous() 
     .antMatchers("/api/products/**").permitAll() 
     .antMatchers("/api/cities/**").permitAll() 
     .antMatchers("/api/order/**").permitAll() 
     .antMatchers("/api/payment").hasIpAddress("XXX.XXX.X.XX") 
     .anyRequest().authenticated() 
     .and() 
     .csrf().requireCsrfProtectionMatcher(new CsrfRequestMatcher()) 
     .and() 
     .formLogin() 
     .loginPage("/login.html") 
     .loginProcessingUrl("/authentication/login") 
     .successHandler(authSuccessHandler) 
     .failureHandler(authFailureHandler) 
     .and() 
     .logout() 
     .logoutUrl("/authentication/logout") 
     .logoutSuccessHandler(logoutSuccessHandler) 
     .deleteCookies(JSESSIONID_COOKIE, CSRF_COOKIE) 
     .invalidateHttpSession(true) 
     .permitAll(); 

Что теперь просто перенаправляет меня на страницу входа в систему, когда я пытаюсь сделать пост из данного Ip Адрес

+0

Возможно, вы получаете NullPointerException – reos

+0

@reos, нет NullPointerException. метод не выполняется вообще. – uksz

+0

Возможно, IP имеет значение null и spring выбрасывает nullpointer – reos

ответ

0

Итак, как я выяснил, я получал запрос через прокси-сервер от nginx, который не передавал исходный IP-адрес запрашивающего. Я должен был добавить некоторые дополнительные настройки Nginx, и теперь я могу проверить IP-адрес, как это:

@RequestMapping(value = "/payment", method = POST) 
public String saveOrder(PaymentDto paymentDto, HttpServletRequest request) { 
    if (request.getHeader("X-Forwarded-For").equals("XXX.XXX.X.XX")){ 
     DO STUFF 
    } 
} 
Смежные вопросы