在以前版本的Spring + Spring安全性中,当我没有使用内置的CSFR时,使用{中描述的技术添加会话对话支持(用于支持多个"编辑"选项卡)很容易{3}},专门实施RequestDataValueProcessor
但是,现在我们使用spring boot及其所有自动配置的优点,CsrfRequestDataValueProcessor
现在实现了RequestDataValueProcessor
如果我添加自己的RequestDataValueProcessor
实现,它永远不会被使用。
任何人都可以指出我正确的方向,以便我可以同时使用CsrfRequestDataValueProcessor
和RequestDataValueProcessor
我假设我需要创建一个复合RequestDataValueProcessor
,或者您可以有多个RequestDataValueProcessor
实现?
提前致谢
答案 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);
}
}