Skip to content

Commit 57d9678

Browse files
committed
Ability to configure authenticationDetailsSource in AnonymousConfigurer
Closes gh-17831 Signed-off-by: DingHao <[email protected]>
1 parent 1093563 commit 57d9678

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919
import java.util.List;
2020
import java.util.UUID;
2121

22+
import jakarta.servlet.http.HttpServletRequest;
23+
2224
import org.springframework.security.authentication.AnonymousAuthenticationProvider;
25+
import org.springframework.security.authentication.AuthenticationDetailsSource;
2326
import org.springframework.security.authentication.AuthenticationProvider;
2427
import org.springframework.security.config.Customizer;
2528
import org.springframework.security.config.annotation.SecurityConfigurer;
@@ -39,6 +42,7 @@
3942
* other than applying this {@link SecurityConfigurer}.
4043
*
4144
* @author Rob Winch
45+
* @author DingHao
4246
* @since 3.2
4347
*/
4448
public final class AnonymousConfigurer<H extends HttpSecurityBuilder<H>>
@@ -50,6 +54,8 @@ public final class AnonymousConfigurer<H extends HttpSecurityBuilder<H>>
5054

5155
private AnonymousAuthenticationFilter authenticationFilter;
5256

57+
private AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource;
58+
5359
private Object principal = "anonymousUser";
5460

5561
private List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS");
@@ -142,6 +148,19 @@ public AnonymousConfigurer<H> authenticationFilter(AnonymousAuthenticationFilter
142148
return this;
143149
}
144150

151+
/**
152+
* Specifies a custom {@link AuthenticationDetailsSource} to use for anonymous
153+
* authentication.
154+
* @param authenticationDetailsSource the custom {@link AuthenticationDetailsSource}
155+
* to use
156+
* @return {@link AnonymousConfigurer} for additional customization
157+
*/
158+
public AnonymousConfigurer<H> authenticationDetailsSource(
159+
AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource) {
160+
this.authenticationDetailsSource = authenticationDetailsSource;
161+
return this;
162+
}
163+
145164
@Override
146165
public void init(H http) {
147166
if (this.authenticationProvider == null) {
@@ -156,6 +175,9 @@ public void configure(H http) {
156175
if (this.authenticationFilter == null) {
157176
this.authenticationFilter = new AnonymousAuthenticationFilter(getKey(), this.principal, this.authorities);
158177
}
178+
if (this.authenticationDetailsSource != null) {
179+
this.authenticationFilter.setAuthenticationDetailsSource(this.authenticationDetailsSource);
180+
}
159181
this.authenticationFilter.setSecurityContextHolderStrategy(getSecurityContextHolderStrategy());
160182
this.authenticationFilter.afterPropertiesSet();
161183
http.addFilter(this.authenticationFilter);

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
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;
2628
import org.springframework.security.config.annotation.SecurityContextChangedListenerConfig;
2729
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
2830
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
@@ -39,6 +41,8 @@
3941
import org.springframework.web.bind.annotation.RestController;
4042
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
4143

44+
import static org.mockito.ArgumentMatchers.any;
45+
import static org.mockito.Mockito.mock;
4246
import static org.mockito.Mockito.verify;
4347
import static org.springframework.security.config.Customizer.withDefaults;
4448
import static org.springframework.security.config.annotation.SecurityContextChangedListenerArgumentMatchers.setAuthentication;
@@ -101,6 +105,37 @@ public void shouldReturnMyCustomAnonymousConfig() throws Exception {
101105
this.mockMvc.perform(get("/")).andExpect(status().isOk()).andExpect(content().string("myAnonymousUser"));
102106
}
103107

108+
@Test
109+
public void anonymousAuthenticationWhenUsingAuthenticationDetailsSourceRefThenMatchesNamespace() throws Exception {
110+
this.spring.register(AuthenticationDetailsSourceAnonymousConfig.class).autowire();
111+
AuthenticationDetailsSource<HttpServletRequest, ?> source = this.spring.getContext()
112+
.getBean(AuthenticationDetailsSource.class);
113+
this.mockMvc.perform(get("/"));
114+
verify(source).buildDetails(any(HttpServletRequest.class));
115+
}
116+
117+
@Configuration
118+
@EnableWebSecurity
119+
@EnableWebMvc
120+
static class AuthenticationDetailsSourceAnonymousConfig {
121+
122+
AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource = mock(
123+
AuthenticationDetailsSource.class);
124+
125+
@Bean
126+
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
127+
return http
128+
.anonymous((anonymous) -> anonymous.authenticationDetailsSource(this.authenticationDetailsSource))
129+
.build();
130+
}
131+
132+
@Bean
133+
AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource() {
134+
return this.authenticationDetailsSource;
135+
}
136+
137+
}
138+
104139
@Configuration
105140
@EnableWebSecurity
106141
@EnableWebMvc

0 commit comments

Comments
 (0)