使用@PreAuthorize的方法安全性 - 403之后不会刷新RequestHeader

时间:2018-05-04 14:02:39

标签: java spring-boot spring-security

我开发了一个用@PreAuthorize注释的方法。 @PreAuthorize annonation在一个单独的类(我认为是“myStringEvaluationService”的@Service)上运行一个方法(称为isStringInList(String s)),以确保该方法返回true。

例如:

@PreAuthorize("@myStringEvaluationService.isStringInList(#myString)")
@RequestMapping(value = "/myEndPoint", method = POST)
void executeThisMethodIfAuthorised(@RequestHeader(name = "whateverTheStringIs") String myString) {
    //do stuff
}

我正在使用Postman向该方法发送HTTP请求。如果我发送列表中的字符串,则上述方法执行正常。如果我发送一个不在列表中的字符串,那么该方法不会执行 - 这很好,这就是我希望它的行为方式。它向邮递员发送403 - Forbidden消息。

问题是当我重新提交列表中的String时,我从调试中看到列表中没有的字符串是每个后续请求发送的字符串。由于某种原因,403错误不会导致myString变量被刷新。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

解决了这个问题。

我编写了一个扩展WebSecurityConfigurerAdapter并覆盖该类'configure(HttpSecurity http)方法的安全配置类。最初我只包含一些代码以允许任何请求映射到端点。导致问题的是,当我在HTTP标头中提交了一个不在列表中的字符串时,Spring Security正在缓存该URL。即使我更改了后续请求的标头,我也没有更改URL,并且Spring Security认为该URL违反了安全性,因此阻止了请求。

对此的补救措施是在configure(HttpSecurity http)方法中包含以下两行代码

http.headers().cacheControl().disable();
http.requestCache().disable();

通过禁用请求缓存,每次发送请求时都会读取新标头。