我正在做一個小專案,包括使用 react 的 web 和使用 spring data rest 的 rest api,它們都打包在一個 jar 中。Web 和 api 都受 Spring Security 保護,表單登錄的默認配置,以及在存盤庫方法上使用 @PreAuthorize 注釋,如 @PreAuthorize("hasRole('ADMIN')")。登錄后,如果用戶有權限,一切正常;但如果不是,請求將等待很長時間(分鐘),并回傳 http 狀態 26。
Spring Boot 版本為 2.7.0
我嘗試過使用 spring-session-jdbc 和 X-Auth-Token 標頭,但仍然相同。
安全配置:
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests().anyRequest().authenticated()
.and()
.csrf().disable()
.cors(Customizer.withDefaults())
.formLogin();
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.addAllowedHeader("*");
configuration.addAllowedMethod("*");
configuration.addAllowedOrigin("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/api/**", configuration);
return source;
}
}
存盤庫端點:
public interface UserRepository extends JpaRepository<User, String> {
@PreAuthorize("hasRole('ADMIN')")
<S extends User> S save(User u);
@PreAuthorize("hasRole('USER')")
List<User> findByNameContains(String name);
測驗請求和回應標頭:
curl -X POST -H 'Content-Type: application/json; charset=utf8;' -i 'http://xxxxxxxxxxxx:8080/api/users' --data '{
"username": "john.m",
"name": "John Murdoch"
}'
# response header
Status Code: 26
access-control-allow-origin: *
cache-control: no-cache, no-store, max-age=0, must-revalidate
connection: keep-alive
date: Mon, 10 Oct 2022 00:58:34 GMT
expires: 0
keep-alive: timeout=60
pragma: no-cache
vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
我發現了問題,我配置了一個全域例外處理程式來處理 AccessDeniedException 但忘記了原因,這導致了問題。洗掉該配置后,回應變為正常 403。
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ AccessDeniedException.class })
public ResponseEntity<Object> handleAccessDeniedException(Exception ex, WebRequest request) {
return new ResponseEntity<Object>(
ex.getLocalizedMessage(),
new HttpHeaders(),
HttpStatus.FORBIDDEN.ordinal());
}
...
}
uj5u.com熱心網友回復:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/513238.html
上一篇:創建Tomcat連接器會創建同一個SpringBoot應用程式的兩個實體-如何在從HTTPS啟動應用程式時訪問HTTP端點
