我是Spring Security的新手,我已将其添加到我的项目中。一切似乎都完美地登录/注销,甚至可以在屏幕上导航。只有当我尝试使用ExtJS网格并在商店中添加记录然后调用商店的 sync()方法时,我才得到 -
Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
我知道我需要在请求时传递_csrf,但我想向大家介绍完成此操作的最佳方法。请帮忙。
当调用商店中的sync()方法时,如何自动将此_csrf与所有AJAX(创建/更新/删除/读取)一起传递?
安全配置
@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();
}
} ],
谢谢!
答案 0 :(得分:0)
如果你想使用CSRF,你不必在春天这样做。而是使用侵入性较小的OWASP方法。在包含ExtJS代码的index.jsp或index.html中,您可以包含CSRFGuard 3 CRSF injection,这将导致在任何AJAX请求中注入CRSF。 要在春季启用CSRF,只需在Spring配置中设置如下内容:
@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();
}
答案 1 :(得分:0)
您可以在所有标题中包含CSRF令牌:
Ext.Ajax.defaultHeaders = {ctoken: token};
在服务器端,从标头获取令牌并匹配会话令牌。