Skip to content

Commit 7149dfc

Browse files
committed
Ability to configure authenticationDetailsSource in AnonymousConfigurer
Closes gh-17831 Signed-off-by: DingHao <[email protected]>
1 parent 727f0e2 commit 7149dfc

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/configurers/AnonymousConfigurer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
* other than applying this {@link SecurityConfigurer}.
4040
*
4141
* @author Rob Winch
42+
* @author DingHao
4243
* @since 3.2
4344
*/
4445
public final class AnonymousConfigurer<H extends HttpSecurityBuilder<H>>
@@ -158,7 +159,7 @@ public void configure(H http) {
158159
}
159160
this.authenticationFilter.setSecurityContextHolderStrategy(getSecurityContextHolderStrategy());
160161
this.authenticationFilter.afterPropertiesSet();
161-
http.addFilter(this.authenticationFilter);
162+
http.addFilter(postProcess(this.authenticationFilter));
162163
}
163164

164165
private String getKey() {

config/src/test/java/org/springframework/security/config/annotation/web/configurers/AnonymousConfigurerTests.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@
1616

1717
package org.springframework.security.config.annotation.web.configurers;
1818

19+
import jakarta.servlet.http.HttpServletRequest;
1920
import org.junit.jupiter.api.Test;
2021
import org.junit.jupiter.api.extension.ExtendWith;
2122

2223
import org.springframework.beans.factory.annotation.Autowired;
2324
import org.springframework.context.annotation.Bean;
2425
import org.springframework.context.annotation.Configuration;
2526
import org.springframework.security.authentication.AnonymousAuthenticationToken;
27+
import org.springframework.security.authentication.AuthenticationDetailsSource;
28+
import org.springframework.security.config.ObjectPostProcessor;
2629
import org.springframework.security.config.annotation.SecurityContextChangedListenerConfig;
2730
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
2831
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
@@ -34,11 +37,14 @@
3437
import org.springframework.security.core.userdetails.UserDetailsService;
3538
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
3639
import org.springframework.security.web.SecurityFilterChain;
40+
import org.springframework.security.web.authentication.AnonymousAuthenticationFilter;
3741
import org.springframework.test.web.servlet.MockMvc;
3842
import org.springframework.web.bind.annotation.GetMapping;
3943
import org.springframework.web.bind.annotation.RestController;
4044
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
4145

46+
import static org.mockito.ArgumentMatchers.any;
47+
import static org.mockito.Mockito.mock;
4248
import static org.mockito.Mockito.verify;
4349
import static org.springframework.security.config.Customizer.withDefaults;
4450
import static org.springframework.security.config.annotation.SecurityContextChangedListenerArgumentMatchers.setAuthentication;
@@ -101,6 +107,45 @@ public void shouldReturnMyCustomAnonymousConfig() throws Exception {
101107
this.mockMvc.perform(get("/")).andExpect(status().isOk()).andExpect(content().string("myAnonymousUser"));
102108
}
103109

110+
@Test
111+
public void anonymousAuthenticationWhenUsingAuthenticationDetailsSourceRefThenMatchesNamespace() throws Exception {
112+
this.spring.register(AuthenticationDetailsSourceAnonymousConfig.class).autowire();
113+
AuthenticationDetailsSource<HttpServletRequest, ?> source = this.spring.getContext()
114+
.getBean(AuthenticationDetailsSource.class);
115+
this.mockMvc.perform(get("/"));
116+
verify(source).buildDetails(any(HttpServletRequest.class));
117+
}
118+
119+
@Configuration
120+
@EnableWebSecurity
121+
@EnableWebMvc
122+
static class AuthenticationDetailsSourceAnonymousConfig {
123+
124+
AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource = mock(
125+
AuthenticationDetailsSource.class);
126+
127+
@Bean
128+
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
129+
return http.anonymous((anonymous) -> anonymous
130+
.withObjectPostProcessor(new ObjectPostProcessor<AnonymousAuthenticationFilter>() {
131+
132+
@Override
133+
public <O extends AnonymousAuthenticationFilter> O postProcess(O object) {
134+
object.setAuthenticationDetailsSource(
135+
AuthenticationDetailsSourceAnonymousConfig.this.authenticationDetailsSource);
136+
return object;
137+
}
138+
139+
})).build();
140+
}
141+
142+
@Bean
143+
AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource() {
144+
return this.authenticationDetailsSource;
145+
}
146+
147+
}
148+
104149
@Configuration
105150
@EnableWebSecurity
106151
@EnableWebMvc

0 commit comments

Comments
 (0)