Spring MVC + Session Conversation(多个标签)+带CSRF + Thymeleaf的Spring Security

时间:2015-04-20 15:56:39

标签: spring-mvc spring-security

在以前版本的Spring + Spring安全性中,当我没有使用内置的CSFR时,使用{中描述的技术添加会话对话支持(用于支持多个"编辑"选项卡)很容易{3}},专门实施RequestDataValueProcessor

但是,现在我们使用spring boot及其所有自动配置的优点,CsrfRequestDataValueProcessor现在实现了RequestDataValueProcessor

如果我添加自己的RequestDataValueProcessor实现,它永远不会被使用。

任何人都可以指出我正确的方向,以便我可以同时使用CsrfRequestDataValueProcessorRequestDataValueProcessor

我假设我需要创建一个复合RequestDataValueProcessor,或者您可以有多个RequestDataValueProcessor实现?

提前致谢

2 个答案:

答案 0 :(得分:0)

我刚刚通过对duckranger解决方案的一个小修改解决了这个问题。我将一个ScrfRequestDataValueProcessor的调用嵌入到getExtraHiddenFields方法中。

@Override
public Map<String, String> getExtraHiddenFields(HttpServletRequest request) {
    CsrfRequestDataValueProcessor csrfRDVP = new CsrfRequestDataValueProcessor();
    Map<String, String> hiddenFields = csrfRDVP.getExtraHiddenFields(request);

    if (request.getAttribute(ConversationalSessionAttributeStore.CID_FIELD) != null) {
        hiddenFields.put(ConversationalSessionAttributeStore.CID_FIELD,
        request.getAttribute(ConversationalSessionAttributeStore.CID_FIELD).toString());
    }

    return hiddenFields;
}

今天刚刚实施,并且几乎没有开始用户测试,因此自行承担风险。

我不禁想到有更好的方法,但这似乎可以解决问题。

答案 1 :(得分:0)

我以为我会分享我的所作所为。 我需要一个解决方案,而且我无法让Thymeleaf使用自己的RequestDataValueProcessor,即使bean是在我的配置中正确创建的。

注意:我知道这很糟糕,但同时也非常有趣。

解决方案:AspectJ .....

@Aspect
public class SessionConversationAspect {

    private final ConversationIdRequestProcessor conversationIdRequestProcessor;

    public SessionConversationAspect() {
        this.conversationIdRequestProcessor = new ConversationIdRequestProcessor();
    }

    @Pointcut("execution(* org.springframework.security.web.servlet.support.csrf.CsrfRequestDataValueProcessor.getExtraHiddenFields(..) ) && args(request) )")
    protected void getExtraHiddenFields(HttpServletRequest request) {
    }

    @AfterReturning(
            pointcut = "getExtraHiddenFields(request)",
            returning = "hiddenFields"
    )
    protected void addExtraHiddenFields(HttpServletRequest request, Map<String, String> hiddenFields) {
        Map<String, String> extraFields = conversationIdRequestProcessor.getExtraHiddenFields(request);
        hiddenFields.putAll(extraFields);
    }

}