Selaa lähdekoodia

Add hasAuthority method to RSocketSecurity

Fixes gh-7435
Luis Felipe Vega Calle 6 vuotta sitten
vanhempi
commit
350bce761f

+ 5 - 0
config/src/main/java/org/springframework/security/config/annotation/rsocket/RSocketSecurity.java

@@ -105,6 +105,7 @@ import java.util.List;
  * </pre>
  * @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));
 			}

+ 19 - 0
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());