Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @PreAuthorize-RequestHeader的方法安全性在403之后不会刷新_Java_Spring Boot_Spring Security - Fatal编程技术网

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

Java @PreAuthorize-RequestHeader的方法安全性在403之后不会刷新,java,spring-boot,spring-security,Java,Spring Boot,Spring Security,我开发了一个用@PreAuthorize注释的方法。@PreAuthorize注释在一个单独的类上运行一个方法(称为isStringInList(String s)),该类是一个@Service,我将其限定为“myStringEvaluationService”),以确保该方法返回true 例如: 我正在使用Postman向该方法发送HTTP请求。如果我发送列表中的字符串,上述方法将正常执行。如果我发送了一个不在列表中的字符串,那么该方法就不会执行——这很好,这就是我希望它的行为方式。它向邮递员

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

例如:

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

问题是,当我重新提交列表上的字符串时,我从调试中发现,列表上不存在的字符串是为每个后续请求发送的字符串。由于某些原因,403错误不会导致myString变量被刷新。有什么办法可以解决这个问题吗?

解决了这个问题

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

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

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

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