Spring Security 4.0内容协商限制

时间:2015-11-15 09:28:34

标签: json spring-security content-negotiation

我有一个使用spring security 4.0的应用程序,现在我担心这个应用程序可以在REST Web服务上发送的内容协商响应,即 我的目标是在全局范围内限制与请求类型无关的响应,即如果那将是通过MVC或某种websocket的REST http get请求(虽然我不确定是否适用于websocket)响应应该只能作为json而不是XML返回。我不想支持xml或任何协商格式。

我担心这个的原因是因为我看了 一个名为Mike Wiesner的绅士关于春季应用程序安全陷阱的InfoQ视频。

我知道我可以在这种情况下使用注释@RequestMapping和子选项“产生”,即类似

@RequestMapping(produces={MediaType.APPLICATION_JSON_VALUE} ,  value = "/target/get", method=RequestMethod.GET)

但是因为我有这么多的控​​制器,所以在我们所有的控制器上添加额外的子选项对我来说将是一场噩梦。

我知道还有其他注释,例如

   @XmlTransient
   @JsonIgnore

这可以帮助我做我想做的事情,即在内容协商发生变化但是将每个注释放在每个上时,使一些filds(getter / setter)不被暴露 getter / setter甚至会成为更大的问题

因此我的问题是如何在全球范围内做到这一点。我想这应该在扩展WebMvcConfigurerAdapter的MVCConfig类中完成? 我的意思是重写configureContentNegotiation方法有多个例子,但这些只是解释了如何设置默认行为。我的问题是我们如何限制行为,即http请求是否带有“Accept”标题application / xml如何在全球范围内拒绝该行为。

默认行为的示例: Spring boot controller content negotiation

所以我所做的就像是

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false).

If anything else then a json comms into the http request 
reject this request or smply ignore it on a global basis.
Do not send/support xml, xhtml, html etc.

  }
}

1 个答案:

答案 0 :(得分:0)

我巧合地在过去几天里正在研究这个问题的相关问题。我们在代码库中手动配置ContentNegotiationManager,在此过程中,我们通过提供被HeaderContentNegotiationStrategy限制的Accept限制来限制Spring PPA策略的基于标头的部分到你想要的。我快速浏览了ContentNegotiationConfigurer(我从未使用过),它似乎没有提供改变HeaderContentNegotiationStrategy映射的选项,所以这里是我们设置ContentNegotiationManager的方式的代码片段。 1}}。

@Bean
public ContentNegotiationManager contentNegotiationManager() {
    //Supply a Map<String, org.springframework.http.MediaType>
    PathExtensionContentNegotiationStrategy pathBased = new PathExtensionContentNegotiationStrategy(supportedMediaTypes());
    //Supply a Map<org.springframework.http.MediaType, org.springframework.http.MediaType>
    HeaderContentNegotiationStrategy headerBased = new MappingHeaderContentNegotiationStrategy(contentTypeMap());
    FixedContentNegotiationStrategy defaultStrategy = new FixedContentNegotiationStrategy(MediaType.APPLICATION_JSON);
    return ContentNegotiationManager(pathBased, headerBased, defaultStrategy);
    return retval;
}

该bean在我们的配置中创建,覆盖WebMvcConfigurerAdapter并注入此bean:

@Bean
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping() {

    RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
    handlerMapping.setOrder(0);
    handlerMapping.setRemoveSemicolonContent(false);
    handlerMapping.getFileExtensions().add("json");
    handlerMapping.setUseRegisteredSuffixPatternMatch(true);
    handlerMapping.setInterceptors(getInterceptors());
    handlerMapping.setContentNegotiationManager(mvcContentNegotiationManager());
    return handlerMapping;
}