我有一个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”路径。我正在调试试图找出可能被覆盖的地方。
答案 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();
}
}