Синхронизация магазина ExtJS с Spring Security включена


Я новичок в Spring Security, и я добавил его в свой проект. Все, кажется, работает идеально войти/выйти и даже навигации по экранам. Только когда я попытался создать сетку ExtJS и добавил запись в хранилище, а затем вызвал метод sync() хранилища, я получил -

Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.

Я знаю, что мне нужно передать _csrf с просьбой, но я хотел бы узнать от всех вас о лучшем способе сделать это. Пожалуйста помочь.

Как я могу передать этот _csrf с все AJAX (create/update/delete/read) автоматически при вызове метода sync() в магазине?

Конфигурация Безопасности

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

    @Autowired
    private BCryptPasswordEncoder encoder;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService).passwordEncoder(encoder);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests().antMatchers("/**").access("hasRole('ROLE_ADMIN')").and().formLogin().and().csrf();

    }
}

Код ExtJS

tbar : [ '->', {
    text : 'Add',
    handler : function(btn) {
        var grid = btn.up('grid');
        var editor = grid.findPlugin('rowediting');
        grid.getStore().insert(0, {});
        editor.startEdit(0, 0);
    }
} ],
bbar : [ '->', {
    text : 'Save',
    handler : function(btn) {
        btn.up('grid').getStore().sync();
    }
} ],

Спасибо!

2 2

2 ответа:

Если вы хотите использовать CSRF, вам не нужно делать это весной. Лучше использовать менее инвазивный метод OWASP. В вашем указателе.jsp или индекс.html, где вы включаете свой код ExtJS, вы можете включить csrfguard 3 crsf injection , который приведет к тому, что CRSF будет введен в любой запрос AJAX. Чтобы включить CSRF весной, вы просто установите что-то вроде следующего в вашей весенней конфигурации:

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
  }

Или в вашем случае:

  @Override
  protected void configure(HttpSecurity http) throws Exception 
  {
     http.authorizeRequests().antMatchers("/**").access("hasRole('ROLE_ADMIN')")
       .and().formLogin()
       .and().csrf().disable();
  }

Вы можете включить маркер CSRF во все заголовки:

Ext.Ajax.defaultHeaders = {ctoken: token};

На стороне сервера получите токен из заголовка и сопоставьте его с токеном сеанса.