CSRF Spring security через ajax(json)

208
13 октября 2018, 14:30

у меня проблема с csrf и SpringSecurity. Когда я посылаю форму я получаю статус 302

я сделал так

auth.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

другими словами

@Override
protected void configure(HttpSecurity auth) throws Exception {
    auth.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
            auth
                    .authorizeRequests()
                    .antMatchers("/static/**","/webjars/**","/registration").permitAll()
                    .antMatchers("/user").access("hasAuthority('USER')")
                    .antMatchers("/admin","/add").access("hasAuthority('ADMIN')")
                    .anyRequest().authenticated()
            .and()
                    .formLogin().loginPage("/login").permitAll()
            .and()
                    .logout()
                    .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                    .permitAll();
}

мапинг

@RequestMapping(value = "/registration",method = RequestMethod.POST)
public ResponseEntity<User> update(@RequestBody User user){
    userMapper.findByName(user.getUsername());
    if (userMapper.findByName(user.getUsername())!=null){
        user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
        userMapper.addUser(user);
        return new ResponseEntity<User>(user, HttpStatus.OK);
    }else
        return new ResponseEntity<User>(user, HttpStatus.CONFLICT);
}

и форма

<form id="registration">
<input type="hidden" name="_csrf" value="{{_csrf.token}}" />
<input type="text" id="username" name="username" placeholder="password">
<input type="password" id="password" name="password" placeholder="password">
<button type="submit">submit</button>

как реализовать Security csrf и ajax (json). если есть туториал или пример, буду благодарен

Answer 1

Для ajax запросов можно убрать csrf на сервере.

auth.csrf().disabled().authorizeRequests()
                    .antMatchers("/static/**","/webjars/**","/registration").permitAll()
                    .antMatchers("/user").access("hasAuthority('USER')")
                    .antMatchers("/admin","/add").access("hasAuthority('ADMIN')")
                    .anyRequest().authenticated()
            .and()
                    .formLogin().loginPage("/login").permitAll()
            .and()
                    .logout()
                    .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                    .permitAll();
Answer 2

Нужно добавить мета теги

<html>
<head>
<meta name="_csrf" content="${_csrf.token}"/>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}"/>
<!-- ... -->
</head>
<!-- ... -->

и так же в сам файл javascripta

$(function () {
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(header, token);
});
});

и вставить токен в отправные данные. Есть еще пару способов, но помог мне этот.

Нашел ответ, по этой ссылке если кому либо понадобится

READ ALSO
Как перевести Spring XML конфиг в Java конфиг?

Как перевести Spring XML конфиг в Java конфиг?

Есть такой бин, в xml конфиге

194
Мавен не создает property

Мавен не создает property

В файле pomxml есть такая конструкция

194
Java - что не то с кодом

Java - что не то с кодом

Объясните, пожалуйста, intellij подчёркивает последнюю строку, ругаясь на spiffoObject, в чем причина?

182
Заменить строку в текстовом файле

Заменить строку в текстовом файле

Подскажите пожалуйста на примере, как заменить строку в текстовом файле, и желательно чтобы файл не разрушился при аварийном сбое программы

215