如何在具有安全性的Spring boot Rest控制器中使用“/ images”路径?

时间:2017-02-24 19:12:19

标签: java spring rest

我有一个Spring启动REST服务(spring-boot-starter-parent:1.3.2),它使用RestController定义的方法公开一些端点。我也在使用Spring安全性。一切正常,直到我尝试定义映射到“/ images”的控制器方法。当我尝试访问此api路径时,我收到以下错误。通过调试,我可以看到我的控制器处理程序正在被映射,但是未调用预授权过滤器(对于其他映射,它被正确调用)。我已设置以下属性,但没有更改。我如何解决这个问题,以便我可以使用“/ images”?

spring.resources.add-mappings=false
spring.mvc.static-path-pattern=/hide-me/**

错误:

    "exception": "org.springframework.security.authentication.AuthenticationCredentialsNotFoundException",
    "message": "An Authentication object was not found in the SecurityContext",

代码:

@RestController
@PreAuthorize(value = "hasAnyAuthority('SOMEUSER')")
public class ImageController {
  ...
  @RequestMapping(value = { "/images/{imageId}" }, method = RequestMethod.GET)
  @ResponseBody
  public Image getImage(@PathVariable UUID imageId) {
    return imageDataService.getImage(imageId);
  }
  ...

如果我将映射更改为以下内容,那么它可以正常工作。

  @RequestMapping(value = { "/image/{imageId}" }, method = RequestMethod.GET)
  @ResponseBody
  public Image getImage(@PathVariable UUID imageId) {
    return imageDataService.getImage(imageId);
  }

我认为静态资源的配置有一个默认条目,告诉Spring安全性忽略preauth过滤器的“/ images”路径。我正在调试试图找出可能被覆盖的地方。

2 个答案:

答案 0 :(得分:2)

SpringBoot默认使用一些路径

  

private static final String [] CLASSPATH_RESOURCE_LOCATIONS = {         “classpath:/ META-INF / resources /”,“classpath:/ resources /”,         “classpath:/ static /”,“classpath:/ public /”};

https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot

其中一条路径是/ images

Java Web Application. Spring Boot. Locating Images

使用SpringSecurity时,您还有以下限制

  

您在Web应用程序中开箱即用的基本功能包括:

     

具有内存存储和单个用户的AuthenticationManager bean   (有关用户属性,请参阅SecurityProperties.User)。忽视   常见静态资源位置的(不安全)路径(/ css / ,   / js / ,/ images / ,/ webjars / 和** / favicon.ico)。 HTTP基础   所有其他端点的安全性。安全事件发布到   Spring的ApplicationEventPublisher(成功和失败   身份验证和访问被拒绝)。

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

Spring Security提供的常见低级功能(HSTS,XSS,CSRF,缓存)默认开启。

答案 1 :(得分:2)

您需要确保为每个请求执行安全性。这可以使用以下SecurityConfiguration

来完成
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated();
    }
}