我终于解决了这个问题,但是它基本上需要重写Spring Security。这就是它的全部荣耀。
首先,我遵循了Eyal Lupu 在此处的精彩博客文章中的建议,但是由于我的AJAX要求,我不得不根据自己的情况进行调整。
至于Thymeleaf的情况,关键花絮隐藏在Thymeleaf论坛的档案中-臭名昭著的第7期。
https://github.com/thymeleaf/thymeleaf-
spring/issues/7#issuecomment-27643488
Thymeleaf的创建者本人最后的评论是:
th:action…检测何时将此属性应用到标记上(无论如何应该是唯一的位置),并且在这种情况下调用RequestDataValueProcessor.getExtraHiddenFields(…),并在结束标记之前添加返回的隐藏字段。
那是我需要令牌才能工作的关键词。不幸的是,为什么
th:action也要启动尚不完全清楚
getExtraHiddenFields,但是无论如何它确实很重要。
因此,对于任何在Thymeleaf + Spring Security CSRF + AJAX
POST上苦苦挣扎的人来说,这是我的步骤(虽然可以将其缩减很多,但是这些是解决该问题的高级概念):
实现Spring接口RequestDataValueProcessor并在Spring Security的XML配置中注册它,以便您可以重写方法getExtraHiddenFields,该方法允许您将隐藏的输入字段插入HTML(当然带有标记)。令牌本身是使用Java.Util UUID生成的。
使用JQuery,从该隐藏字段中读取值,然后设置请求标头的“ X-CSRF-Token”属性,以使其通过HTTP发送。无法将令牌仅保留在隐藏的输入字段中,因为我们没有执行表单Submit,而是使用AJAX POST来调用服务器端的方法。
扩展Spring的HandlerInterceptorAdapter并将其注册为拦截器,以便每次执行POST方法时,都会调用服务器端的“ preHandle”方法,以便可以将请求令牌(从上一步的HTTP标头中提取)与请求令牌进行比较。会话的令牌(应该相同!)。执行此检查后,它可以允许请求通过或返回错误。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)