Skip to content

Commit 673e2f2

Browse files
Merge branch 'spring-projects:main' into main
2 parents b5d8626 + ee9a887 commit 673e2f2

File tree

164 files changed

+4460
-912
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

164 files changed

+4460
-912
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright 2002-2013 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.security.config;
18+
19+
import org.springframework.beans.factory.Aware;
20+
import org.springframework.beans.factory.DisposableBean;
21+
import org.springframework.beans.factory.InitializingBean;
22+
23+
/**
24+
* Allows initialization of Objects. Typically this is used to call the {@link Aware}
25+
* methods, {@link InitializingBean#afterPropertiesSet()}, and ensure that
26+
* {@link DisposableBean#destroy()} has been invoked.
27+
*
28+
* @param <T> the bound of the types of Objects this {@link ObjectPostProcessor} supports.
29+
* @author Rob Winch
30+
* @since 3.2
31+
*/
32+
public interface ObjectPostProcessor<T> {
33+
34+
static <S> ObjectPostProcessor<S> identity() {
35+
return new ObjectPostProcessor<>() {
36+
@Override
37+
public <O extends S> O postProcess(O object) {
38+
return object;
39+
}
40+
};
41+
}
42+
43+
/**
44+
* Initialize the object possibly returning a modified instance that should be used
45+
* instead.
46+
* @param object the object to initialize
47+
* @return the initialized version of the object
48+
*/
49+
<O extends T> O postProcess(O object);
50+
51+
}

config/src/main/java/org/springframework/security/config/annotation/AbstractConfiguredSecurityBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.commons.logging.LogFactory;
2929

3030
import org.springframework.security.config.Customizer;
31+
import org.springframework.security.config.ObjectPostProcessor;
3132
import org.springframework.security.config.annotation.web.builders.WebSecurity;
3233
import org.springframework.util.Assert;
3334
import org.springframework.web.filter.DelegatingFilterProxy;

config/src/main/java/org/springframework/security/config/annotation/ObjectPostProcessor.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@
2828
* @param <T> the bound of the types of Objects this {@link ObjectPostProcessor} supports.
2929
* @author Rob Winch
3030
* @since 3.2
31+
* @deprecated please use {@link org.springframework.security.config.ObjectPostProcessor}
32+
* instead
3133
*/
32-
public interface ObjectPostProcessor<T> {
34+
@Deprecated
35+
public interface ObjectPostProcessor<T> extends org.springframework.security.config.ObjectPostProcessor<T> {
3336

3437
/**
3538
* Initialize the object possibly returning a modified instance that should be used

config/src/main/java/org/springframework/security/config/annotation/SecurityConfigurerAdapter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.springframework.core.GenericTypeResolver;
2323
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
24+
import org.springframework.security.config.ObjectPostProcessor;
2425
import org.springframework.util.Assert;
2526

2627
/**

config/src/main/java/org/springframework/security/config/annotation/authentication/builders/AuthenticationManagerBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import org.springframework.security.authentication.AuthenticationManager;
2727
import org.springframework.security.authentication.AuthenticationProvider;
2828
import org.springframework.security.authentication.ProviderManager;
29+
import org.springframework.security.config.ObjectPostProcessor;
2930
import org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder;
30-
import org.springframework.security.config.annotation.ObjectPostProcessor;
3131
import org.springframework.security.config.annotation.SecurityBuilder;
3232
import org.springframework.security.config.annotation.SecurityConfigurer;
3333
import org.springframework.security.config.annotation.authentication.ProviderManagerBuilder;

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

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2024 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.
@@ -28,7 +28,6 @@
2828
import org.springframework.aop.framework.ProxyFactoryBean;
2929
import org.springframework.aop.target.LazyInitTargetSource;
3030
import org.springframework.beans.factory.BeanFactoryUtils;
31-
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
3231
import org.springframework.beans.factory.annotation.Autowired;
3332
import org.springframework.context.ApplicationContext;
3433
import org.springframework.context.ConfigurableApplicationContext;
@@ -40,7 +39,7 @@
4039
import org.springframework.security.authentication.AuthenticationEventPublisher;
4140
import org.springframework.security.authentication.AuthenticationManager;
4241
import org.springframework.security.authentication.DefaultAuthenticationEventPublisher;
43-
import org.springframework.security.config.annotation.ObjectPostProcessor;
42+
import org.springframework.security.config.ObjectPostProcessor;
4443
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
4544
import org.springframework.security.config.annotation.authentication.configurers.provisioning.InMemoryUserDetailsManagerConfigurer;
4645
import org.springframework.security.config.annotation.authentication.configurers.provisioning.JdbcUserDetailsManagerConfigurer;
@@ -57,6 +56,7 @@
5756
* Exports the authentication {@link Configuration}
5857
*
5958
* @author Rob Winch
59+
* @author Ngoc Nhan
6060
* @since 3.2
6161
*
6262
*/
@@ -197,15 +197,6 @@ private AuthenticationManager getAuthenticationManagerBean() {
197197
return lazyBean(AuthenticationManager.class);
198198
}
199199

200-
private static <T> T getBeanOrNull(ApplicationContext applicationContext, Class<T> type) {
201-
try {
202-
return applicationContext.getBean(type);
203-
}
204-
catch (NoSuchBeanDefinitionException notFound) {
205-
return null;
206-
}
207-
}
208-
209200
private static class EnableGlobalAuthenticationAutowiredConfigurer extends GlobalAuthenticationConfigurerAdapter {
210201

211202
private final ApplicationContext context;
@@ -330,12 +321,9 @@ private PasswordEncoder getPasswordEncoder() {
330321
if (this.passwordEncoder != null) {
331322
return this.passwordEncoder;
332323
}
333-
PasswordEncoder passwordEncoder = getBeanOrNull(this.applicationContext, PasswordEncoder.class);
334-
if (passwordEncoder == null) {
335-
passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
336-
}
337-
this.passwordEncoder = passwordEncoder;
338-
return passwordEncoder;
324+
this.passwordEncoder = this.applicationContext.getBeanProvider(PasswordEncoder.class)
325+
.getIfUnique(PasswordEncoderFactories::createDelegatingPasswordEncoder);
326+
return this.passwordEncoder;
339327
}
340328

341329
@Override

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
* {@link PasswordEncoder} is defined will wire this up too.
4040
*
4141
* @author Rob Winch
42+
* @author Ngoc Nhan
4243
* @since 4.1
4344
*/
4445
@Order(InitializeUserDetailsBeanManagerConfigurer.DEFAULT_ORDER)
@@ -121,11 +122,7 @@ else if (userDetailsServices.size() > 1) {
121122
* component, null otherwise.
122123
*/
123124
private <T> T getBeanOrNull(Class<T> type) {
124-
String[] beanNames = InitializeUserDetailsBeanManagerConfigurer.this.context.getBeanNamesForType(type);
125-
if (beanNames.length != 1) {
126-
return null;
127-
}
128-
return InitializeUserDetailsBeanManagerConfigurer.this.context.getBean(beanNames[0], type);
125+
return InitializeUserDetailsBeanManagerConfigurer.this.context.getBeanProvider(type).getIfUnique();
129126
}
130127

131128
/**

config/src/main/java/org/springframework/security/config/annotation/authentication/configurers/ldap/LdapAuthenticationProviderConfigurer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import org.springframework.ldap.core.support.BaseLdapPathContextSource;
2323
import org.springframework.security.authentication.AuthenticationManager;
2424
import org.springframework.security.authentication.AuthenticationProvider;
25-
import org.springframework.security.config.annotation.ObjectPostProcessor;
25+
import org.springframework.security.config.ObjectPostProcessor;
2626
import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
2727
import org.springframework.security.config.annotation.authentication.ProviderManagerBuilder;
2828
import org.springframework.security.config.annotation.web.configurers.ChannelSecurityConfigurer;

config/src/main/java/org/springframework/security/config/annotation/authentication/configurers/userdetails/AbstractDaoAuthenticationConfigurer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package org.springframework.security.config.annotation.authentication.configurers.userdetails;
1818

1919
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
20-
import org.springframework.security.config.annotation.ObjectPostProcessor;
20+
import org.springframework.security.config.ObjectPostProcessor;
2121
import org.springframework.security.config.annotation.SecurityBuilder;
2222
import org.springframework.security.config.annotation.authentication.ProviderManagerBuilder;
2323
import org.springframework.security.core.userdetails.UserDetailsPasswordService;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import org.springframework.beans.factory.SmartInitializingSingleton;
3131
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
3232
import org.springframework.core.NativeDetector;
33-
import org.springframework.security.config.annotation.ObjectPostProcessor;
33+
import org.springframework.security.config.ObjectPostProcessor;
3434
import org.springframework.util.Assert;
3535

3636
/**

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.springframework.context.annotation.Bean;
2222
import org.springframework.context.annotation.Configuration;
2323
import org.springframework.context.annotation.Role;
24-
import org.springframework.security.config.annotation.ObjectPostProcessor;
24+
import org.springframework.security.config.ObjectPostProcessor;
2525
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
2626
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
2727

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

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2024 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.
@@ -27,7 +27,6 @@
2727
import org.springframework.beans.BeansException;
2828
import org.springframework.beans.factory.BeanFactory;
2929
import org.springframework.beans.factory.BeanFactoryAware;
30-
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
3130
import org.springframework.beans.factory.SmartInitializingSingleton;
3231
import org.springframework.beans.factory.annotation.Autowired;
3332
import org.springframework.beans.factory.config.BeanDefinition;
@@ -69,7 +68,7 @@
6968
import org.springframework.security.authentication.AuthenticationManager;
7069
import org.springframework.security.authentication.AuthenticationTrustResolver;
7170
import org.springframework.security.authentication.DefaultAuthenticationEventPublisher;
72-
import org.springframework.security.config.annotation.ObjectPostProcessor;
71+
import org.springframework.security.config.ObjectPostProcessor;
7372
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
7473
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
7574
import org.springframework.security.config.core.GrantedAuthorityDefaults;
@@ -84,6 +83,7 @@
8483
*
8584
* @author Rob Winch
8685
* @author Eddú Meléndez
86+
* @author Ngoc Nhan
8787
* @since 3.2
8888
* @see EnableGlobalMethodSecurity
8989
* @deprecated Use {@link PrePostMethodSecurityConfiguration},
@@ -168,33 +168,28 @@ public void afterSingletonsInstantiated() {
168168
catch (Exception ex) {
169169
throw new RuntimeException(ex);
170170
}
171-
PermissionEvaluator permissionEvaluator = getSingleBeanOrNull(PermissionEvaluator.class);
171+
PermissionEvaluator permissionEvaluator = getBeanOrNull(PermissionEvaluator.class);
172172
if (permissionEvaluator != null) {
173173
this.defaultMethodExpressionHandler.setPermissionEvaluator(permissionEvaluator);
174174
}
175-
RoleHierarchy roleHierarchy = getSingleBeanOrNull(RoleHierarchy.class);
175+
RoleHierarchy roleHierarchy = getBeanOrNull(RoleHierarchy.class);
176176
if (roleHierarchy != null) {
177177
this.defaultMethodExpressionHandler.setRoleHierarchy(roleHierarchy);
178178
}
179-
AuthenticationTrustResolver trustResolver = getSingleBeanOrNull(AuthenticationTrustResolver.class);
179+
AuthenticationTrustResolver trustResolver = getBeanOrNull(AuthenticationTrustResolver.class);
180180
if (trustResolver != null) {
181181
this.defaultMethodExpressionHandler.setTrustResolver(trustResolver);
182182
}
183-
GrantedAuthorityDefaults grantedAuthorityDefaults = getSingleBeanOrNull(GrantedAuthorityDefaults.class);
183+
GrantedAuthorityDefaults grantedAuthorityDefaults = getBeanOrNull(GrantedAuthorityDefaults.class);
184184
if (grantedAuthorityDefaults != null) {
185185
this.defaultMethodExpressionHandler.setDefaultRolePrefix(grantedAuthorityDefaults.getRolePrefix());
186186
}
187187

188188
this.defaultMethodExpressionHandler = this.objectPostProcessor.postProcess(this.defaultMethodExpressionHandler);
189189
}
190190

191-
private <T> T getSingleBeanOrNull(Class<T> type) {
192-
try {
193-
return this.context.getBean(type);
194-
}
195-
catch (NoSuchBeanDefinitionException ex) {
196-
}
197-
return null;
191+
private <T> T getBeanOrNull(Class<T> type) {
192+
return this.context.getBeanProvider(type).getIfUnique();
198193
}
199194

200195
private void initializeMethodSecurityInterceptor() throws Exception {
@@ -262,7 +257,7 @@ protected AccessDecisionManager accessDecisionManager() {
262257
decisionVoters.add(new Jsr250Voter());
263258
}
264259
RoleVoter roleVoter = new RoleVoter();
265-
GrantedAuthorityDefaults grantedAuthorityDefaults = getSingleBeanOrNull(GrantedAuthorityDefaults.class);
260+
GrantedAuthorityDefaults grantedAuthorityDefaults = getBeanOrNull(GrantedAuthorityDefaults.class);
266261
if (grantedAuthorityDefaults != null) {
267262
roleVoter.setRolePrefix(grantedAuthorityDefaults.getRolePrefix());
268263
}
@@ -373,7 +368,7 @@ public MethodSecurityMetadataSource methodSecurityMetadataSource() {
373368
sources.add(new SecuredAnnotationSecurityMetadataSource());
374369
}
375370
if (isJsr250Enabled) {
376-
GrantedAuthorityDefaults grantedAuthorityDefaults = getSingleBeanOrNull(GrantedAuthorityDefaults.class);
371+
GrantedAuthorityDefaults grantedAuthorityDefaults = getBeanOrNull(GrantedAuthorityDefaults.class);
377372
Jsr250MethodSecurityMetadataSource jsr250MethodSecurityMetadataSource = this.context
378373
.getBean(Jsr250MethodSecurityMetadataSource.class);
379374
if (grantedAuthorityDefaults != null) {

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

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import java.util.function.Supplier;
2020

21-
import io.micrometer.observation.ObservationRegistry;
2221
import org.aopalliance.intercept.MethodInterceptor;
2322
import org.aopalliance.intercept.MethodInvocation;
2423

@@ -36,9 +35,9 @@
3635
import org.springframework.security.authorization.AuthoritiesAuthorizationManager;
3736
import org.springframework.security.authorization.AuthorizationEventPublisher;
3837
import org.springframework.security.authorization.AuthorizationManager;
39-
import org.springframework.security.authorization.ObservationAuthorizationManager;
4038
import org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor;
4139
import org.springframework.security.authorization.method.Jsr250AuthorizationManager;
40+
import org.springframework.security.config.ObjectPostProcessor;
4241
import org.springframework.security.config.core.GrantedAuthorityDefaults;
4342
import org.springframework.security.core.context.SecurityContextHolderStrategy;
4443

@@ -58,8 +57,15 @@ final class Jsr250MethodSecurityConfiguration implements ImportAware, AopInfrast
5857

5958
private final Jsr250AuthorizationManager authorizationManager = new Jsr250AuthorizationManager();
6059

61-
private AuthorizationManagerBeforeMethodInterceptor methodInterceptor = AuthorizationManagerBeforeMethodInterceptor
62-
.jsr250(this.authorizationManager);
60+
private final AuthorizationManagerBeforeMethodInterceptor methodInterceptor;
61+
62+
Jsr250MethodSecurityConfiguration(
63+
ObjectProvider<ObjectPostProcessor<AuthorizationManager<MethodInvocation>>> postProcessors) {
64+
ObjectPostProcessor<AuthorizationManager<MethodInvocation>> postProcessor = postProcessors
65+
.getIfUnique(ObjectPostProcessor::identity);
66+
AuthorizationManager<MethodInvocation> manager = postProcessor.postProcess(this.authorizationManager);
67+
this.methodInterceptor = AuthorizationManagerBeforeMethodInterceptor.jsr250(manager);
68+
}
6369

6470
@Bean
6571
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
@@ -95,16 +101,6 @@ void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityCont
95101
this.methodInterceptor.setSecurityContextHolderStrategy(securityContextHolderStrategy);
96102
}
97103

98-
@Autowired(required = false)
99-
void setObservationRegistry(ObservationRegistry registry) {
100-
if (registry.isNoop()) {
101-
return;
102-
}
103-
AuthorizationManager<MethodInvocation> observed = new ObservationAuthorizationManager<>(registry,
104-
this.authorizationManager);
105-
this.methodInterceptor = AuthorizationManagerBeforeMethodInterceptor.secured(observed);
106-
}
107-
108104
@Autowired(required = false)
109105
void setEventPublisher(AuthorizationEventPublisher eventPublisher) {
110106
this.methodInterceptor.setAuthorizationEventPublisher(eventPublisher);

0 commit comments

Comments
 (0)