Skip to content

Commit f45a639

Browse files
committed
Support resolution of AuthenticatedPrincipal in RSocket handler methods
Closes gh-28444
1 parent 2b7a034 commit f45a639

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
lines changed

spring-boot-project/spring-boot-autoconfigure/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ dependencies {
147147
optional("org.springframework.security:spring-security-oauth2-jose")
148148
optional("org.springframework.security:spring-security-oauth2-resource-server")
149149
optional("org.springframework.security:spring-security-rsocket")
150+
optional("org.springframework.security:spring-security-messaging")
150151
optional("org.springframework.security:spring-security-saml2-service-provider")
151152
optional("org.springframework.security:spring-security-web")
152153
optional("org.springframework.session:spring-session-core")

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/rsocket/RSocketSecurityAutoConfiguration.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818

1919
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2020
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
21+
import org.springframework.boot.autoconfigure.rsocket.RSocketMessageHandlerCustomizer;
2122
import org.springframework.boot.rsocket.server.RSocketServerCustomizer;
2223
import org.springframework.context.annotation.Bean;
2324
import org.springframework.context.annotation.Configuration;
2425
import org.springframework.security.config.annotation.rsocket.EnableRSocketSecurity;
26+
import org.springframework.security.messaging.handler.invocation.reactive.AuthenticationPrincipalArgumentResolver;
2527
import org.springframework.security.rsocket.core.SecuritySocketAcceptorInterceptor;
2628

2729
/**
@@ -30,6 +32,7 @@
3032
*
3133
* @author Madhura Bhave
3234
* @author Brian Clozel
35+
* @author Guirong Hu
3336
* @since 2.2.0
3437
*/
3538
@Configuration(proxyBeanMethods = false)
@@ -42,4 +45,16 @@ RSocketServerCustomizer springSecurityRSocketSecurity(SecuritySocketAcceptorInte
4245
return (server) -> server.interceptors((registry) -> registry.forSocketAcceptor(interceptor));
4346
}
4447

48+
@ConditionalOnClass(AuthenticationPrincipalArgumentResolver.class)
49+
@Configuration(proxyBeanMethods = false)
50+
static class RSocketSecurityMessageHandlerConfiguration {
51+
52+
@Bean
53+
RSocketMessageHandlerCustomizer springSecurityRSocketMessageHandler() {
54+
return (messageHandler) -> messageHandler.getArgumentResolverConfigurer()
55+
.addCustomResolver(new AuthenticationPrincipalArgumentResolver());
56+
}
57+
58+
}
59+
4560
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/rsocket/RSocketSecurityAutoConfigurationTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,23 @@
1616

1717
package org.springframework.boot.autoconfigure.security.rsocket;
1818

19+
import java.util.List;
20+
1921
import io.rsocket.core.RSocketServer;
2022
import org.junit.jupiter.api.Test;
2123

2224
import org.springframework.boot.autoconfigure.AutoConfigurations;
25+
import org.springframework.boot.autoconfigure.rsocket.RSocketMessageHandlerCustomizer;
2326
import org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration;
2427
import org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration;
2528
import org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration;
2629
import org.springframework.boot.rsocket.server.RSocketServerCustomizer;
2730
import org.springframework.boot.test.context.FilteredClassLoader;
2831
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
32+
import org.springframework.messaging.handler.invocation.reactive.HandlerMethodArgumentResolver;
33+
import org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler;
2934
import org.springframework.security.config.annotation.rsocket.RSocketSecurity;
35+
import org.springframework.security.messaging.handler.invocation.reactive.AuthenticationPrincipalArgumentResolver;
3036
import org.springframework.security.rsocket.core.SecuritySocketAcceptorInterceptor;
3137

3238
import static org.assertj.core.api.Assertions.assertThat;
@@ -69,4 +75,19 @@ void autoConfigurationAddsCustomizerForServerRSocketFactory() {
6975
});
7076
}
7177

78+
@Test
79+
void autoConfigurationAddsCustomizerForMessageHandlerRSocketFactory() {
80+
RSocketMessageHandler handler = new RSocketMessageHandler();
81+
this.contextRunner.run((context) -> {
82+
RSocketMessageHandlerCustomizer customizer = context.getBean(RSocketMessageHandlerCustomizer.class);
83+
customizer.customize(handler);
84+
85+
List<HandlerMethodArgumentResolver> customResolvers = handler.getArgumentResolverConfigurer()
86+
.getCustomResolvers();
87+
assertThat(customResolvers).isNotEmpty();
88+
assertThat(customResolvers)
89+
.anyMatch((customResolver) -> customResolver instanceof AuthenticationPrincipalArgumentResolver);
90+
});
91+
}
92+
7293
}

0 commit comments

Comments
 (0)