|
1 | 1 | /* |
2 | | - * Copyright 2002-2022 the original author or authors. |
| 2 | + * Copyright 2002-2025 the original author or authors. |
3 | 3 | * |
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | 5 | * you may not use this file except in compliance with the License. |
@@ -50,14 +50,19 @@ public class ExceptionTranslationWebFilter implements WebFilter { |
50 | 50 | @Override |
51 | 51 | public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { |
52 | 52 | return chain.filter(exchange) |
53 | | - .onErrorResume(AccessDeniedException.class, (denied) -> exchange.getPrincipal() |
54 | | - .filter((principal) -> (!(principal instanceof Authentication) || (principal instanceof Authentication |
55 | | - && (this.authenticationTrustResolver.isAuthenticated((Authentication) principal))))) |
56 | | - .switchIfEmpty(commenceAuthentication(exchange, |
57 | | - new InsufficientAuthenticationException( |
58 | | - "Full authentication is required to access this resource"))) |
59 | | - .flatMap((principal) -> this.accessDeniedHandler.handle(exchange, denied)) |
60 | | - .then()); |
| 53 | + .onErrorResume(AccessDeniedException.class, |
| 54 | + (denied) -> exchange.getPrincipal() |
| 55 | + .switchIfEmpty(Mono.defer(() -> commenceAuthentication(exchange, null))) |
| 56 | + .flatMap((principal) -> { |
| 57 | + if (!(principal instanceof Authentication authentication)) { |
| 58 | + return this.accessDeniedHandler.handle(exchange, denied); |
| 59 | + } |
| 60 | + if (this.authenticationTrustResolver.isAuthenticated(authentication)) { |
| 61 | + return this.accessDeniedHandler.handle(exchange, denied); |
| 62 | + } |
| 63 | + return commenceAuthentication(exchange, authentication); |
| 64 | + }) |
| 65 | + .then()); |
61 | 66 | } |
62 | 67 |
|
63 | 68 | /** |
@@ -92,10 +97,11 @@ public void setAuthenticationTrustResolver(AuthenticationTrustResolver authentic |
92 | 97 | this.authenticationTrustResolver = authenticationTrustResolver; |
93 | 98 | } |
94 | 99 |
|
95 | | - private <T> Mono<T> commenceAuthentication(ServerWebExchange exchange, AuthenticationException denied) { |
96 | | - return this.authenticationEntryPoint |
97 | | - .commence(exchange, new AuthenticationCredentialsNotFoundException("Not Authenticated", denied)) |
98 | | - .then(Mono.empty()); |
| 100 | + private <T> Mono<T> commenceAuthentication(ServerWebExchange exchange, Authentication authentication) { |
| 101 | + AuthenticationException cause = new InsufficientAuthenticationException( |
| 102 | + "Full authentication is required to access this resource"); |
| 103 | + AuthenticationException ex = new AuthenticationCredentialsNotFoundException("Not Authenticated", cause); |
| 104 | + return this.authenticationEntryPoint.commence(exchange, ex).then(Mono.empty()); |
99 | 105 | } |
100 | 106 |
|
101 | 107 | } |
0 commit comments