我开发了一个用@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变量被刷新。有没有办法解决这个问题?
答案 0 :(得分:0)
解决了这个问题。
我编写了一个扩展WebSecurityConfigurerAdapter并覆盖该类'configure(HttpSecurity http)方法的安全配置类。最初我只包含一些代码以允许任何请求映射到端点。导致问题的是,当我在HTTP标头中提交了一个不在列表中的字符串时,Spring Security正在缓存该URL。即使我更改了后续请求的标头,我也没有更改URL,并且Spring Security认为该URL违反了安全性,因此阻止了请求。
对此的补救措施是在configure(HttpSecurity http)方法中包含以下两行代码
http.headers().cacheControl().disable();
http.requestCache().disable();
通过禁用请求缓存,每次发送请求时都会读取新标头。