2016-06-29 2 views
4

Я разработал приложение с пружинным ботинком, которое отлично работает. Существует спокойный контроллер. Я попытался добавить весеннюю безопасность на некоторые страницы. конечная точка контроллера Rest являетсяКак включить методы POST, PUT AND DELETE в весенней безопасности

/api/greetings

Я настроил параметры безопасности в классе ниже.

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
       .antMatchers("/", "/home","/api/greetings").permitAll() 
       //.antMatchers("/api/greetings","").permitAll()//can't do this 
       .anyRequest().authenticated() 
       .and() 
      .formLogin() 
       .loginPage("/login") 
       .permitAll() 
       .and() 
      .logout() 
       .permitAll(); 
    } 

Теперь, когда я попытался получить доступ к конечной точке Rest, из Rest-клиент (Почтальон), только метод GET доступен и я получаю 403 Forbidden ответ, если я пытаюсь POST, PUT или DELETE.

{ 
    "timestamp": 1467223888525, 
    "status": 403, 
    "error": "Forbidden", 
    "message": "Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.", 
    "path": "/api/greetings/2" 
} 

Как решить эту проблему. Я новичок в Spring Security.

+0

Поскольку мое приложение не является браузером, отключение csrf не повредит, и это сработало для меня. Мне было любопытно, что, если я не хочу отключать csrf, или если мое приложение также является веб-приложением, я нашел эту ссылку. Не пробовал, хотя и попытаюсь в ближайшее время. http://stackoverflow.com/questions/27182701/how-do-i-send-spring-csrf-token-from-postman-rest-client – Rajan

ответ

3

UPDATE Ответ

Если вы используете Spring Security 4, вы можете отключить конкретные маршруты легко

http.csrf().ignoringAntMatchers("/nocsrf","/ignore/startswith/**") 

Если нет, то вы можете включить/отключить CSRF на конкретных маршрутах с использованием requireCsrfProtectionMatcher

http.csrf().requireCsrfProtectionMatcher(new RequestMatcher() { 
    private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$"); 
    private RegexRequestMatcher apiMatcher = new RegexRequestMatcher("/v[0-9]*/.*", null); 

    @Override 
    public boolean matches(HttpServletRequest request) { 
     // No CSRF due to allowedMethod 
     if(allowedMethods.matcher(request.getMethod()).matches()) 
      return false; 

     // No CSRF due to api call 
     if(apiMatcher.matches(request)) 
      return false; 

     // CSRF for everything else that is not an API call or an allowedMethod 
     return true; 
    } 
}); 

ОРИГИНАЛ ОТКАЗ ОТ

У вас возникла ошибка, так как обработка CSRF по умолчанию включена в Spring Security.

Вы можете отключить его, добавив http.csrf().disable();.

Но действительно, не могли бы вы оставить свое приложение незащищенным? Я предлагаю вам прочитать this article, чтобы защитить ваше приложение от CSRF, даже если ваше приложение основано на службе REST и не отправляет заявку.

+0

Есть ли другой способ, не отключая csrf? – Rajan