Skip to content

Commit 3a66191

Browse files
eberttceddumelendez
andcommitted
Add hasAnyAuthority method in AuthorizePayloadsSpec.Access
See Fixes gh-7437 Co-authored-by: Eddú Meléndez <[email protected]>
1 parent 3425db6 commit 3a66191

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

config/src/main/java/org/springframework/security/config/annotation/rsocket/RSocketSecurity.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
* }
105105
* </pre>
106106
* @author Rob Winch
107+
* @author Ebert Toribio
107108
* @since 5.2
108109
*/
109110
public class RSocketSecurity {
@@ -320,6 +321,10 @@ public AuthorizePayloadsSpec permitAll() {
320321
.just(new AuthorizationDecision(true)));
321322
}
322323

324+
public AuthorizePayloadsSpec hasAnyAuthority(String... authorities) {
325+
return access(AuthorityReactiveAuthorizationManager.hasAnyAuthority(authorities));
326+
}
327+
323328
public AuthorizePayloadsSpec access(
324329
ReactiveAuthorizationManager<PayloadExchangeAuthorizationContext> authorization) {
325330
AuthorizePayloadsSpec.this.authzBuilder.add(new PayloadExchangeMatcherEntry<>(this.matcher, authorization));

config/src/test/java/org/springframework/security/config/annotation/rsocket/RSocketMessageHandlerConnectionITests.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151

5252
/**
5353
* @author Rob Winch
54+
* @author Ebert Toribio
5455
*/
5556
@ContextConfiguration
5657
@RunWith(SpringRunner.class)
@@ -167,6 +168,23 @@ public void connectWhenNotAuthorized() {
167168
// .isInstanceOf(RejectedSetupException.class);
168169
}
169170

171+
@Test
172+
public void connectWithAnyAuthority() {
173+
UsernamePasswordMetadata credentials =
174+
new UsernamePasswordMetadata("ebert", "ebert");
175+
this.requester = requester()
176+
.setupMetadata(credentials, UsernamePasswordMetadata.BASIC_AUTHENTICATION_MIME_TYPE)
177+
.connectTcp(this.server.address().getHostName(), this.server.address().getPort())
178+
.block();
179+
180+
String hiEbert = this.requester.route("management.users")
181+
.data("ebert")
182+
.retrieveMono(String.class)
183+
.block();
184+
185+
assertThat(hiEbert).isEqualTo("Hi ebert");
186+
}
187+
170188
private RSocketRequester.Builder requester() {
171189
return RSocketRequester.builder()
172190
.rsocketStrategies(this.handler.getRSocketStrategies());
@@ -208,13 +226,18 @@ MapReactiveUserDetailsService uds() {
208226
.password("password")
209227
.roles("USER", "SETUP")
210228
.build();
229+
UserDetails manager = User.withDefaultPasswordEncoder()
230+
.username("ebert")
231+
.password("ebert")
232+
.roles("SETUP", "MANAGER")
233+
.build();
211234

212235
UserDetails evil = User.withDefaultPasswordEncoder()
213236
.username("evil")
214237
.password("password")
215238
.roles("EVIL")
216239
.build();
217-
return new MapReactiveUserDetailsService(admin, user, evil);
240+
return new MapReactiveUserDetailsService(admin, user, manager, evil);
218241
}
219242

220243
@Bean
@@ -225,6 +248,7 @@ PayloadSocketAcceptorInterceptor rsocketInterceptor(RSocketSecurity rsocket) {
225248
.setup().hasRole("SETUP")
226249
.route("secure.admin.*").hasRole("ADMIN")
227250
.route("secure.**").hasRole("USER")
251+
.route("management.*").hasAnyAuthority("ROLE_MANAGER")
228252
.anyRequest().permitAll()
229253
)
230254
.basicAuthentication(Customizer.withDefaults());

0 commit comments

Comments
 (0)