Skip to content

Commit 793820a

Browse files
committed
Remove Authority Copying From Reactive
We will re-address this when adding factors to ReactiveAuthenticationManager implementations. Issue gh-2603
1 parent b6ed037 commit 793820a

File tree

2 files changed

+0
-95
lines changed

2 files changed

+0
-95
lines changed

web/src/main/java/org/springframework/security/web/server/authentication/AuthenticationWebFilter.java

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@
1616

1717
package org.springframework.security.web.server.authentication;
1818

19-
import java.lang.reflect.Method;
20-
import java.util.Set;
2119
import java.util.function.Function;
22-
import java.util.stream.Collectors;
2320

2421
import org.apache.commons.logging.Log;
2522
import org.apache.commons.logging.LogFactory;
@@ -30,7 +27,6 @@
3027
import org.springframework.security.authentication.ReactiveAuthenticationManagerResolver;
3128
import org.springframework.security.core.Authentication;
3229
import org.springframework.security.core.AuthenticationException;
33-
import org.springframework.security.core.GrantedAuthority;
3430
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
3531
import org.springframework.security.core.context.SecurityContextImpl;
3632
import org.springframework.security.web.server.WebFilterExchange;
@@ -126,51 +122,12 @@ private Mono<Void> authenticate(ServerWebExchange exchange, WebFilterChain chain
126122
.flatMap((authenticationManager) -> authenticationManager.authenticate(token))
127123
.switchIfEmpty(Mono
128124
.defer(() -> Mono.error(new IllegalStateException("No provider found for " + token.getClass()))))
129-
.flatMap(this::applyCurrentAuthenication)
130125
.flatMap(
131126
(authentication) -> onAuthenticationSuccess(authentication, new WebFilterExchange(exchange, chain)))
132127
.doOnError(AuthenticationException.class,
133128
(ex) -> logger.debug(LogMessage.format("Authentication failed: %s", ex.getMessage()), ex));
134129
}
135130

136-
private Mono<Authentication> applyCurrentAuthenication(Authentication result) {
137-
return ReactiveSecurityContextHolder.getContext().map((context) -> {
138-
Authentication current = context.getAuthentication();
139-
if (current == null) {
140-
return result;
141-
}
142-
if (!current.isAuthenticated()) {
143-
return result;
144-
}
145-
if (!declaresToBuilder(result)) {
146-
return result;
147-
}
148-
return result.toBuilder()
149-
// @formatter:off
150-
.authorities((a) -> {
151-
Set<String> newAuthorities = a.stream()
152-
.map(GrantedAuthority::getAuthority)
153-
.collect(Collectors.toUnmodifiableSet());
154-
for (GrantedAuthority currentAuthority : current.getAuthorities()) {
155-
if (!newAuthorities.contains(currentAuthority.getAuthority())) {
156-
a.add(currentAuthority);
157-
}
158-
}
159-
})
160-
.build();
161-
// @formatter:on
162-
}).switchIfEmpty(Mono.just(result));
163-
}
164-
165-
private static boolean declaresToBuilder(Authentication authentication) {
166-
for (Method method : authentication.getClass().getDeclaredMethods()) {
167-
if (method.getName().equals("toBuilder") && method.getParameterTypes().length == 0) {
168-
return true;
169-
}
170-
}
171-
return false;
172-
}
173-
174131
protected Mono<Void> onAuthenticationSuccess(Authentication authentication, WebFilterExchange webFilterExchange) {
175132
ServerWebExchange exchange = webFilterExchange.getExchange();
176133
SecurityContextImpl securityContext = new SecurityContextImpl();

web/src/test/java/org/springframework/security/web/server/authentication/AuthenticationWebFilterTests.java

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,8 @@
2525
import reactor.core.publisher.Mono;
2626

2727
import org.springframework.security.authentication.BadCredentialsException;
28-
import org.springframework.security.authentication.NonBuildableAuthenticationToken;
2928
import org.springframework.security.authentication.ReactiveAuthenticationManager;
3029
import org.springframework.security.authentication.ReactiveAuthenticationManagerResolver;
31-
import org.springframework.security.authentication.SecurityAssertions;
3230
import org.springframework.security.authentication.TestingAuthenticationToken;
3331
import org.springframework.security.core.Authentication;
3432
import org.springframework.security.core.GrantedAuthority;
@@ -178,31 +176,6 @@ public void filterWhenDefaultsAndAuthenticationFailThenUnauthorized() {
178176
assertThat(result.getResponseCookies()).isEmpty();
179177
}
180178

181-
@Test
182-
public void filterWhenAuthenticatedThenCombinesAuthorities() {
183-
String ROLE_EXISTING = "ROLE_EXISTING";
184-
TestingAuthenticationToken existingAuthn = new TestingAuthenticationToken("username", "password",
185-
ROLE_EXISTING);
186-
given(this.authenticationManager.authenticate(any()))
187-
.willReturn(Mono.just(new TestingAuthenticationToken("user", "password", "TEST")));
188-
given(this.securityContextRepository.save(any(), any())).willReturn(Mono.empty());
189-
this.filter = new AuthenticationWebFilter(this.authenticationManager);
190-
this.filter.setSecurityContextRepository(this.securityContextRepository);
191-
WebTestClient client = WebTestClientBuilder.bindToWebFilters(new RunAsWebFilter(existingAuthn), this.filter)
192-
.build();
193-
client.get()
194-
.uri("/")
195-
.headers((headers) -> headers.setBasicAuth("test", "this"))
196-
.exchange()
197-
.expectStatus()
198-
.isOk();
199-
ArgumentCaptor<SecurityContext> context = ArgumentCaptor.forClass(SecurityContext.class);
200-
verify(this.securityContextRepository).save(any(), context.capture());
201-
Authentication authentication = context.getValue().getAuthentication();
202-
assertThat(authentication.getAuthorities()).extracting(GrantedAuthority::getAuthority)
203-
.containsExactlyInAnyOrder(ROLE_EXISTING, "TEST");
204-
}
205-
206179
/**
207180
* This is critical to avoid adding duplicate GrantedAuthority instances with the
208181
* same' authority when the issuedAt is too old and a new instance is requested.
@@ -232,31 +205,6 @@ public void filterWhenDefaultEqualsAuthorityThenNoDuplicates() {
232205
.containsExactly(DefaultEqualsGrantedAuthority.AUTHORITY);
233206
}
234207

235-
@Test
236-
void doFilterWhenNotOverridingToBuilderThenDoesNotMergeAuthorities() throws Exception {
237-
TestingAuthenticationToken existingAuthn = new TestingAuthenticationToken("username", "password", "FACTORONE");
238-
given(this.authenticationManager.authenticate(any()))
239-
.willReturn(Mono.just(new NonBuildableAuthenticationToken("user", "password", "FACTORTWO")));
240-
given(this.securityContextRepository.save(any(), any())).willReturn(Mono.empty());
241-
this.filter = new AuthenticationWebFilter(this.authenticationManager);
242-
this.filter.setSecurityContextRepository(this.securityContextRepository);
243-
WebTestClient client = WebTestClientBuilder.bindToWebFilters(new RunAsWebFilter(existingAuthn), this.filter)
244-
.build();
245-
client.get()
246-
.uri("/")
247-
.headers((headers) -> headers.setBasicAuth("test", "this"))
248-
.exchange()
249-
.expectStatus()
250-
.isOk();
251-
ArgumentCaptor<SecurityContext> context = ArgumentCaptor.forClass(SecurityContext.class);
252-
verify(this.securityContextRepository).save(any(), context.capture());
253-
Authentication authentication = context.getValue().getAuthentication();
254-
SecurityAssertions.assertThat(authentication)
255-
.authorities()
256-
.extracting(GrantedAuthority::getAuthority)
257-
.containsExactly("FACTORTWO");
258-
}
259-
260208
@Test
261209
public void filterWhenAuthenticationManagerResolverDefaultsAndAuthenticationFailThenUnauthorized() {
262210
given(this.authenticationManager.authenticate(any()))

0 commit comments

Comments
 (0)