Grails 3 CSRF保护

恩佐

是否可以使用spring-security插件在grails3应用程序中配置CSRF保护,除了grails表单的useToken属性,我什么都找不到,然后在控制器内部调用withForm。但这实际上不是一个非常灵活的解决方案。我喜欢这里的过滤器方法

恩佐

为了保护csrf,我重用了org.springframework.security.web.csrf.CsrfFilter您需要在grails resouces.groovy中定义新bean(请参见下面的摘录-csrfFilter bean)。您可以定义自己的accessDeniedHandlerrequireCsrfProtectionMatcher这是resources.groovy的片段:

csrfFilter(CsrfFilter, new HttpSessionCsrfTokenRepository()) {
    accessDeniedHandler = ref('fnAccessDeniedHandler')
    requireCsrfProtectionMatcher = ref('fnRequireCsrfProtectionMatcher')
}

现在在Bootstrap.groovy中将此过滤器添加到过滤器链中:

 SpringSecurityUtils.clientRegisterFilter('csrfFilter',    SecurityFilterPosition.LAST.order + 10)

现在,在主布局GSP中添加以下标记,以在每页上添加csrf令牌:

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

因此,现在在应用程序的每个页面上都显示了csrf令牌,您可以将其用于每个ajax请求(例如,application.js的片段(我正在使用grails 3)):

$(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);
    });
});

对于每个jquery ajax请求,我们现在正在发送csrf令牌。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章