Skip to content

Commit 1ec040e

Browse files
eleftheriasrwinch
authored andcommitted
Disable bean proxying in configuration classes
Fixes gh-6967
1 parent 371a3b9 commit 1ec040e

20 files changed

+234
-34
lines changed

config/src/main/java/org/springframework/security/config/annotation/authentication/configuration/AuthenticationConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
* @since 3.2
5858
*
5959
*/
60-
@Configuration
60+
@Configuration(proxyBeanMethods = false)
6161
@Import(ObjectPostProcessorConfiguration.class)
6262
public class AuthenticationConfiguration {
6363

config/src/main/java/org/springframework/security/config/annotation/configuration/ObjectPostProcessorConfiguration.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2013 the original author or authors.
2+
* Copyright 2002-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -33,7 +33,7 @@
3333
* @author Rob Winch
3434
* @since 3.2
3535
*/
36-
@Configuration
36+
@Configuration(proxyBeanMethods = false)
3737
public class ObjectPostProcessorConfiguration {
3838

3939
@Bean

config/src/main/java/org/springframework/security/config/annotation/method/configuration/GlobalMethodSecurityConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
* @since 3.2
8080
* @see EnableGlobalMethodSecurity
8181
*/
82-
@Configuration
82+
@Configuration(proxyBeanMethods = false)
8383
public class GlobalMethodSecurityConfiguration
8484
implements ImportAware, SmartInitializingSingleton, BeanFactoryAware {
8585
private static final Log logger = LogFactory

config/src/main/java/org/springframework/security/config/annotation/method/configuration/Jsr250MetadataSourceConfiguration.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2016 the original author or authors.
2+
* Copyright 2002-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
1919
import org.springframework.context.annotation.Configuration;
2020
import org.springframework.security.access.annotation.Jsr250MethodSecurityMetadataSource;
2121

22-
@Configuration
22+
@Configuration(proxyBeanMethods = false)
2323
class Jsr250MetadataSourceConfiguration {
2424

2525
@Bean

config/src/main/java/org/springframework/security/config/annotation/method/configuration/ReactiveMethodSecurityConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
* @author Tadaya Tsuyukubo
3939
* @since 5.0
4040
*/
41-
@Configuration
41+
@Configuration(proxyBeanMethods = false)
4242
class ReactiveMethodSecurityConfiguration implements ImportAware {
4343
private int advisorOrder;
4444

config/src/main/java/org/springframework/security/config/annotation/web/configuration/OAuth2ClientConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public String[] selectImports(AnnotationMetadata importingClassMetadata) {
5858
}
5959
}
6060

61-
@Configuration
61+
@Configuration(proxyBeanMethods = false)
6262
static class OAuth2ClientWebMvcSecurityConfiguration implements WebMvcConfigurer {
6363
private ClientRegistrationRepository clientRegistrationRepository;
6464
private OAuth2AuthorizedClientRepository authorizedClientRepository;

config/src/main/java/org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
* @author Keesun Baik
6464
* @since 3.2
6565
*/
66-
@Configuration
66+
@Configuration(proxyBeanMethods = false)
6767
public class WebSecurityConfiguration implements ImportAware, BeanClassLoaderAware {
6868
private WebSecurity webSecurity;
6969

config/src/main/java/org/springframework/security/config/annotation/web/reactive/ReactiveOAuth2ClientImportSelector.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2018 the original author or authors.
2+
* Copyright 2002-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -52,7 +52,7 @@ public String[] selectImports(AnnotationMetadata importingClassMetadata) {
5252
new String[] {};
5353
}
5454

55-
@Configuration
55+
@Configuration(proxyBeanMethods = false)
5656
static class OAuth2ClientWebFluxSecurityConfiguration implements WebFluxConfigurer {
5757
private ReactiveClientRegistrationRepository clientRegistrationRepository;
5858

config/src/main/java/org/springframework/security/config/annotation/web/reactive/ServerHttpSecurityConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
* @author Dan Zheng
4343
* @since 5.0
4444
*/
45-
@Configuration
45+
@Configuration(proxyBeanMethods = false)
4646
class ServerHttpSecurityConfiguration {
4747
private static final String BEAN_NAME_PREFIX = "org.springframework.security.config.annotation.web.reactive.HttpSecurityConfiguration.";
4848
private static final String HTTPSECURITY_BEAN_NAME = BEAN_NAME_PREFIX + "httpSecurity";

config/src/main/java/org/springframework/security/config/annotation/web/reactive/WebFluxSecurityConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
* @author Rob Winch
3939
* @since 5.0
4040
*/
41-
@Configuration
41+
@Configuration(proxyBeanMethods = false)
4242
class WebFluxSecurityConfiguration {
4343
public static final int WEB_FILTER_CHAIN_FILTER_ORDER = 0 - 100;
4444

config/src/main/java/org/springframework/security/config/annotation/web/servlet/configuration/WebMvcSecurityConfiguration.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2013 the original author or authors.
2+
* Copyright 2002-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
1818
import java.util.List;
1919

2020
import org.springframework.context.annotation.Bean;
21+
import org.springframework.context.annotation.Configuration;
2122
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
2223
import org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolver;
2324
import org.springframework.security.web.servlet.support.csrf.CsrfRequestDataValueProcessor;
@@ -37,6 +38,7 @@
3738
* @author Rob Winch
3839
* @since 3.2
3940
*/
41+
@Configuration(proxyBeanMethods = false)
4042
@EnableWebSecurity
4143
public class WebMvcSecurityConfiguration implements WebMvcConfigurer {
4244

config/src/test/java/org/springframework/security/config/annotation/authentication/configuration/AuthenticationConfigurationTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ public void getAuthenticationManagerWhenAuthenticationConfigurationSubclassedThe
542542
.isInstanceOf(AlreadyBuiltException.class);
543543
}
544544

545-
@Configuration(proxyBeanMethods = false)
545+
@Configuration
546546
static class AuthenticationConfigurationSubclass extends AuthenticationConfiguration {
547547
}
548548
}

config/src/test/java/org/springframework/security/config/annotation/authentication/configuration/EnableGlobalAuthenticationTests.java

+73-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2016 the original author or authors.
2+
* Copyright 2002-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,26 +17,30 @@
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
1919

20+
import org.junit.Rule;
2021
import org.junit.Test;
21-
import org.junit.runner.RunWith;
2222
import org.springframework.beans.factory.annotation.Autowired;
23+
import org.springframework.context.annotation.Bean;
2324
import org.springframework.context.annotation.Configuration;
2425
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
25-
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
26+
import org.springframework.security.config.test.SpringTestRule;
2627

2728
/**
2829
*
2930
* @author Rob Winch
3031
*
3132
*/
32-
@RunWith(SpringJUnit4ClassRunner.class)
3333
public class EnableGlobalAuthenticationTests {
34-
@Autowired
35-
AuthenticationConfiguration auth;
34+
@Rule
35+
public final SpringTestRule spring = new SpringTestRule();
3636

3737
// gh-4086
3838
@Test
3939
public void authenticationConfigurationWhenGetAuthenticationManagerThenNotNull() throws Exception {
40+
this.spring.register(Config.class).autowire();
41+
42+
AuthenticationConfiguration auth = spring.getContext().getBean(AuthenticationConfiguration.class);
43+
4044
assertThat(auth.getAuthenticationManager()).isNotNull();
4145
}
4246

@@ -50,4 +54,67 @@ public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception
5054
}
5155
}
5256

57+
@Test
58+
public void enableGlobalAuthenticationWhenNoConfigurationAnnotationThenBeanProxyingEnabled() {
59+
this.spring.register(BeanProxyEnabledByDefaultConfig.class).autowire();
60+
61+
Child childBean = this.spring.getContext().getBean(Child.class);
62+
Parent parentBean = this.spring.getContext().getBean(Parent.class);
63+
64+
assertThat(parentBean.getChild()).isSameAs(childBean);
65+
}
66+
67+
@EnableGlobalAuthentication
68+
static class BeanProxyEnabledByDefaultConfig {
69+
@Bean
70+
public Child child() {
71+
return new Child();
72+
}
73+
74+
@Bean
75+
public Parent parent() {
76+
return new Parent(child());
77+
}
78+
}
79+
80+
@Test
81+
public void enableGlobalAuthenticationWhenProxyBeanMethodsFalseThenBeanProxyingDisabled() {
82+
this.spring.register(BeanProxyDisabledConfig.class).autowire();
83+
84+
Child childBean = this.spring.getContext().getBean(Child.class);
85+
Parent parentBean = this.spring.getContext().getBean(Parent.class);
86+
87+
assertThat(parentBean.getChild()).isNotSameAs(childBean);
88+
}
89+
90+
@Configuration(proxyBeanMethods = false)
91+
@EnableGlobalAuthentication
92+
static class BeanProxyDisabledConfig {
93+
@Bean
94+
public Child child() {
95+
return new Child();
96+
}
97+
98+
@Bean
99+
public Parent parent() {
100+
return new Parent(child());
101+
}
102+
}
103+
104+
static class Parent {
105+
private Child child;
106+
107+
Parent(Child child) {
108+
this.child = child;
109+
}
110+
111+
public Child getChild() {
112+
return child;
113+
}
114+
}
115+
116+
static class Child {
117+
Child() {
118+
}
119+
}
53120
}

config/src/test/java/org/springframework/security/config/annotation/method/configuration/GlobalMethodSecurityConfigurationTests.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ public void emptyPrefixRoleUser() {}
557557

558558
@Test
559559
public void methodSecurityInterceptorUsesMetadataSourceBeanWhenProxyingDisabled() {
560-
this.spring.register(CustomMetadataSourceProxylessConfig.class).autowire();
560+
this.spring.register(CustomMetadataSourceBeanProxyEnabledConfig.class).autowire();
561561
MethodSecurityInterceptor methodInterceptor =
562562
(MethodSecurityInterceptor) this.spring.getContext().getBean(MethodInterceptor.class);
563563
MethodSecurityMetadataSource methodSecurityMetadataSource =
@@ -567,7 +567,7 @@ public void methodSecurityInterceptorUsesMetadataSourceBeanWhenProxyingDisabled(
567567
}
568568

569569
@EnableGlobalMethodSecurity(prePostEnabled = true)
570-
@Configuration(proxyBeanMethods = false)
571-
public static class CustomMetadataSourceProxylessConfig extends GlobalMethodSecurityConfiguration {
570+
@Configuration
571+
public static class CustomMetadataSourceBeanProxyEnabledConfig extends GlobalMethodSecurityConfiguration {
572572
}
573573
}

config/src/test/java/org/springframework/security/config/annotation/method/configuration/ReactiveMethodSecurityConfigurationTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ GrantedAuthorityDefaults grantedAuthorityDefaults() {
8989
}
9090

9191
@Test
92-
public void rolePrefixWithGrantedAuthorityDefaultsAndSubclassWithProxyingDisabled() {
92+
public void rolePrefixWithGrantedAuthorityDefaultsAndSubclassWithProxyingEnabled() {
9393
this.spring.register(SubclassConfig.class).autowire();
9494

9595
TestingAuthenticationToken authentication = new TestingAuthenticationToken(
@@ -105,7 +105,7 @@ public void rolePrefixWithGrantedAuthorityDefaultsAndSubclassWithProxyingDisable
105105
assertThat(root.hasRole("ABC")).isTrue();
106106
}
107107

108-
@Configuration(proxyBeanMethods = false)
108+
@Configuration
109109
static class SubclassConfig extends ReactiveMethodSecurityConfiguration {
110110
}
111111
}

config/src/test/java/org/springframework/security/config/annotation/web/configuration/EnableWebSecurityTests.java

+65-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2018 the original author or authors.
2+
* Copyright 2002-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -122,4 +122,68 @@ String principal(@AuthenticationPrincipal String principal) {
122122
}
123123
}
124124
}
125+
126+
@Test
127+
public void enableWebSecurityWhenNoConfigurationAnnotationThenBeanProxyingEnabled() {
128+
this.spring.register(BeanProxyEnabledByDefaultConfig.class).autowire();
129+
130+
Child childBean = this.spring.getContext().getBean(Child.class);
131+
Parent parentBean = this.spring.getContext().getBean(Parent.class);
132+
133+
assertThat(parentBean.getChild()).isSameAs(childBean);
134+
}
135+
136+
@EnableWebSecurity
137+
static class BeanProxyEnabledByDefaultConfig extends WebSecurityConfigurerAdapter {
138+
@Bean
139+
public Child child() {
140+
return new Child();
141+
}
142+
143+
@Bean
144+
public Parent parent() {
145+
return new Parent(child());
146+
}
147+
}
148+
149+
@Test
150+
public void enableWebSecurityWhenProxyBeanMethodsFalseThenBeanProxyingDisabled() {
151+
this.spring.register(BeanProxyDisabledConfig.class).autowire();
152+
153+
Child childBean = this.spring.getContext().getBean(Child.class);
154+
Parent parentBean = this.spring.getContext().getBean(Parent.class);
155+
156+
assertThat(parentBean.getChild()).isNotSameAs(childBean);
157+
}
158+
159+
@Configuration(proxyBeanMethods = false)
160+
@EnableWebSecurity
161+
static class BeanProxyDisabledConfig extends WebSecurityConfigurerAdapter {
162+
@Bean
163+
public Child child() {
164+
return new Child();
165+
}
166+
167+
@Bean
168+
public Parent parent() {
169+
return new Parent(child());
170+
}
171+
}
172+
173+
static class Parent {
174+
private Child child;
175+
176+
Parent(Child child) {
177+
this.child = child;
178+
}
179+
180+
public Child getChild() {
181+
return child;
182+
}
183+
}
184+
185+
static class Child {
186+
Child() {
187+
}
188+
}
125189
}

config/src/test/java/org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurationTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ public void getMethodDelegatingApplicationListenerWhenWebSecurityConfigurationTh
406406
}
407407

408408
@Test
409-
public void loadConfigWhenProxyingDisabledAndSubclassThenFilterChainsCreated() {
409+
public void loadConfigWhenBeanProxyingEnabledAndSubclassThenFilterChainsCreated() {
410410
this.spring.register(GlobalAuthenticationWebSecurityConfigurerAdaptersConfig.class, SubclassConfig.class).autowire();
411411

412412
FilterChainProxy filterChainProxy = this.spring.getContext().getBean(FilterChainProxy.class);
@@ -415,7 +415,7 @@ public void loadConfigWhenProxyingDisabledAndSubclassThenFilterChainsCreated() {
415415
assertThat(filterChains).hasSize(4);
416416
}
417417

418-
@Configuration(proxyBeanMethods = false)
418+
@Configuration
419419
static class SubclassConfig extends WebSecurityConfiguration {
420420
}
421421

0 commit comments

Comments
 (0)