Skip to content

Commit 7cf93db

Browse files
committed
Auto config AuthenticationPrincipalArgumentResolver When AnnotationTemplateExpressionDefaults bean is Present
1 parent 136f801 commit 7cf93db

File tree

4 files changed

+29
-2
lines changed

4 files changed

+29
-2
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.springframework.context.annotation.Bean;
4141
import org.springframework.context.expression.BeanFactoryResolver;
4242
import org.springframework.expression.BeanResolver;
43+
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
4344
import org.springframework.security.core.context.SecurityContextHolder;
4445
import org.springframework.security.core.context.SecurityContextHolderStrategy;
4546
import org.springframework.security.web.FilterChainProxy;
@@ -82,12 +83,15 @@ class WebMvcSecurityConfiguration implements WebMvcConfigurer, ApplicationContex
8283
private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder
8384
.getContextHolderStrategy();
8485

86+
private AnnotationTemplateExpressionDefaults templateDefaults;
87+
8588
@Override
8689
@SuppressWarnings("deprecation")
8790
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
8891
AuthenticationPrincipalArgumentResolver authenticationPrincipalResolver = new AuthenticationPrincipalArgumentResolver();
8992
authenticationPrincipalResolver.setBeanResolver(this.beanResolver);
9093
authenticationPrincipalResolver.setSecurityContextHolderStrategy(this.securityContextHolderStrategy);
94+
authenticationPrincipalResolver.setTemplateDefaults(this.templateDefaults);
9195
argumentResolvers.add(authenticationPrincipalResolver);
9296
argumentResolvers
9397
.add(new org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver());
@@ -109,6 +113,9 @@ public void setApplicationContext(ApplicationContext applicationContext) throws
109113
if (applicationContext.getBeanNamesForType(SecurityContextHolderStrategy.class).length == 1) {
110114
this.securityContextHolderStrategy = applicationContext.getBean(SecurityContextHolderStrategy.class);
111115
}
116+
if (applicationContext.getBeanNamesForType(AnnotationTemplateExpressionDefaults.class).length == 1) {
117+
this.templateDefaults = applicationContext.getBean(AnnotationTemplateExpressionDefaults.class);
118+
}
112119
}
113120

114121
/**

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.security.authentication.UserDetailsRepositoryReactiveAuthenticationManager;
3535
import org.springframework.security.authentication.password.ReactiveCompromisedPasswordChecker;
3636
import org.springframework.security.config.web.server.ServerHttpSecurity;
37+
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
3738
import org.springframework.security.core.userdetails.ReactiveUserDetailsPasswordService;
3839
import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
3940
import org.springframework.security.crypto.password.PasswordEncoder;
@@ -120,12 +121,14 @@ public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) {
120121
}
121122

122123
@Bean
123-
AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver() {
124+
AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver(
125+
ObjectProvider<AnnotationTemplateExpressionDefaults> templateDefaults) {
124126
AuthenticationPrincipalArgumentResolver resolver = new AuthenticationPrincipalArgumentResolver(
125127
this.adapterRegistry);
126128
if (this.beanFactory != null) {
127129
resolver.setBeanResolver(new BeanFactoryResolver(this.beanFactory));
128130
}
131+
templateDefaults.ifAvailable(resolver::setTemplateDefaults);
129132
return resolver;
130133
}
131134

config/src/main/java/org/springframework/security/config/annotation/web/socket/WebSocketMessageBrokerSecurityConfiguration.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springframework.security.authorization.AuthorizationManager;
3636
import org.springframework.security.authorization.ObservationAuthorizationManager;
3737
import org.springframework.security.authorization.SpringAuthorizationEventPublisher;
38+
import org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults;
3839
import org.springframework.security.core.context.SecurityContextHolder;
3940
import org.springframework.security.core.context.SecurityContextHolderStrategy;
4041
import org.springframework.security.messaging.access.intercept.AuthorizationChannelInterceptor;
@@ -82,6 +83,8 @@ final class WebSocketMessageBrokerSecurityConfiguration
8283

8384
private ApplicationContext context;
8485

86+
private AnnotationTemplateExpressionDefaults templateDefaults;
87+
8588
WebSocketMessageBrokerSecurityConfiguration(ApplicationContext context) {
8689
this.context = context;
8790
}
@@ -90,6 +93,7 @@ final class WebSocketMessageBrokerSecurityConfiguration
9093
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
9194
AuthenticationPrincipalArgumentResolver resolver = new AuthenticationPrincipalArgumentResolver();
9295
resolver.setSecurityContextHolderStrategy(this.securityContextHolderStrategy);
96+
resolver.setTemplateDefaults(this.templateDefaults);
9397
argumentResolvers.add(resolver);
9498
}
9599

@@ -128,6 +132,11 @@ void setObservationRegistry(ObservationRegistry observationRegistry) {
128132
this.observationRegistry = observationRegistry;
129133
}
130134

135+
@Autowired(required = false)
136+
void setTemplateDefaults(AnnotationTemplateExpressionDefaults templateDefaults) {
137+
this.templateDefaults = templateDefaults;
138+
}
139+
131140
@Override
132141
public void afterSingletonsInstantiated() {
133142
SimpleUrlHandlerMapping mapping = getBeanOrNull(SIMPLE_URL_HANDLER_MAPPING_BEAN_NAME,

config/src/main/java/org/springframework/security/config/websocket/WebSocketMessageBrokerSecurityBeanDefinitionParser.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,8 @@ static class MessageSecurityPostProcessor implements BeanDefinitionRegistryPostP
305305

306306
private static final String CUSTOM_ARG_RESOLVERS_PROP = "customArgumentResolvers";
307307

308+
private static final String TEMPLATE_EXPRESSION_BEAN_ID = "templateDefaults";
309+
308310
private final String inboundSecurityInterceptorId;
309311

310312
private final boolean sameOriginDisabled;
@@ -327,7 +329,13 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) t
327329
if (current != null) {
328330
argResolvers.addAll((ManagedList<?>) current.getValue());
329331
}
330-
argResolvers.add(new RootBeanDefinition(AuthenticationPrincipalArgumentResolver.class));
332+
RootBeanDefinition beanDefinition = new RootBeanDefinition(
333+
AuthenticationPrincipalArgumentResolver.class);
334+
if (registry.containsBeanDefinition(TEMPLATE_EXPRESSION_BEAN_ID)) {
335+
beanDefinition.getPropertyValues()
336+
.add(TEMPLATE_EXPRESSION_BEAN_ID, new RuntimeBeanReference(TEMPLATE_EXPRESSION_BEAN_ID));
337+
}
338+
argResolvers.add(beanDefinition);
331339
bd.getPropertyValues().add(CUSTOM_ARG_RESOLVERS_PROP, argResolvers);
332340
if (!registry.containsBeanDefinition(PATH_MATCHER_BEAN_NAME)) {
333341
PropertyValue pathMatcherProp = bd.getPropertyValues().getPropertyValue("pathMatcher");

0 commit comments

Comments
 (0)