diff --git a/config/src/main/java/org/springframework/security/config/annotation/rsocket/RSocketSecurity.java b/config/src/main/java/org/springframework/security/config/annotation/rsocket/RSocketSecurity.java index dbabb2df85..3faba9659b 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/rsocket/RSocketSecurity.java +++ b/config/src/main/java/org/springframework/security/config/annotation/rsocket/RSocketSecurity.java @@ -105,6 +105,7 @@ import java.util.List; * * @author Rob Winch * @author Jesús Ascama Arias + * @author Luis Felipe Vega * @since 5.2 */ public class RSocketSecurity { @@ -312,6 +313,10 @@ public class RSocketSecurity { return access(AuthenticatedReactiveAuthorizationManager.authenticated()); } + public AuthorizePayloadsSpec hasAuthority(String authority) { + return access(AuthorityReactiveAuthorizationManager.hasAuthority(authority)); + } + public AuthorizePayloadsSpec hasRole(String role) { return access(AuthorityReactiveAuthorizationManager.hasRole(role)); } diff --git a/config/src/test/java/org/springframework/security/config/annotation/rsocket/RSocketMessageHandlerConnectionITests.java b/config/src/test/java/org/springframework/security/config/annotation/rsocket/RSocketMessageHandlerConnectionITests.java index 7641ce9a6a..59adfa2296 100644 --- a/config/src/test/java/org/springframework/security/config/annotation/rsocket/RSocketMessageHandlerConnectionITests.java +++ b/config/src/test/java/org/springframework/security/config/annotation/rsocket/RSocketMessageHandlerConnectionITests.java @@ -51,6 +51,7 @@ import static org.assertj.core.api.Assertions.assertThatCode; /** * @author Rob Winch + * @author Luis Felipe Vega */ @ContextConfiguration @RunWith(SpringRunner.class) @@ -135,6 +136,23 @@ public class RSocketMessageHandlerConnectionITests { assertThat(hiRob).isEqualTo("Hi rob"); } + @Test + public void routeWhenStreamCredentialsHaveAuthority() { + UsernamePasswordMetadata connectCredentials = new UsernamePasswordMetadata("user", "password"); + this.requester = requester() + .setupMetadata(connectCredentials, UsernamePasswordMetadata.BASIC_AUTHENTICATION_MIME_TYPE) + .connectTcp(this.server.address().getHostName(), this.server.address().getPort()) + .block(); + + String hiUser = this.requester.route("secure.authority.retrieve-mono") + .metadata(new UsernamePasswordMetadata("admin", "password"), UsernamePasswordMetadata.BASIC_AUTHENTICATION_MIME_TYPE) + .data("Felipe") + .retrieveMono(String.class) + .block(); + + assertThat(hiUser).isEqualTo("Hi Felipe"); + } + @Test public void connectWhenNotAuthenticated() { this.requester = requester() @@ -225,6 +243,7 @@ public class RSocketMessageHandlerConnectionITests { .setup().hasRole("SETUP") .route("secure.admin.*").hasRole("ADMIN") .route("secure.**").hasRole("USER") + .route("secure.authority.*").hasAuthority("ROLE_USER") .anyRequest().permitAll() ) .basicAuthentication(Customizer.withDefaults());