Add :reactive:rsocket:hello-security

This commit is contained in:
Rob Winch
2020-07-10 13:56:34 -05:00
parent 54c37286b3
commit 7ca21117e1
13 changed files with 509 additions and 0 deletions

View File

@@ -0,0 +1,73 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package example;
import io.rsocket.metadata.WellKnownMimeType;
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Mono;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.rsocket.context.LocalRSocketServerPort;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.messaging.rsocket.RSocketRequester;
import org.springframework.security.rsocket.metadata.SimpleAuthenticationEncoder;
import org.springframework.security.rsocket.metadata.UsernamePasswordMetadata;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
/**
* Integration tests for the rsocket application.
*
* @author Rob Winch
* @author Eddú Meléndez
* @since 5.0
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloRSocketApplicationITests {
@Autowired
RSocketRequester.Builder requester;
@LocalRSocketServerPort
int port;
@Test
void messageWhenAuthenticatedThenSuccess() {
UsernamePasswordMetadata credentials = new UsernamePasswordMetadata("user", "password");
// @formatter:off
RSocketRequester requester = this.requester
.rsocketStrategies((builder) -> builder.encoder(new SimpleAuthenticationEncoder()))
.setupMetadata(credentials, MimeTypeUtils.parseMimeType(WellKnownMimeType.MESSAGE_RSOCKET_AUTHENTICATION.getString()))
.connectTcp("localhost", this.port)
.block();
// @formatter:on
String message = requester.route("message").data(Mono.empty()).retrieveMono(String.class).block();
assertThat(message).isEqualTo("Hello");
}
@Test
void messageWhenNotAuthenticatedThenError() {
RSocketRequester requester = this.requester.connectTcp("localhost", this.port).block();
assertThatThrownBy(() -> requester.route("message").data(Mono.empty()).retrieveMono(String.class).block())
.isNotNull();
}
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Minimal RSocket Security application.
*
* @author Rob Winch
* @since 5.2
*/
@SpringBootApplication
public class HelloRSocketApplication {
public static void main(String[] args) {
SpringApplication.run(HelloRSocketApplication.class, args);
}
}

View File

@@ -0,0 +1,38 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package example;
import reactor.core.publisher.Mono;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.stereotype.Controller;
/**
* Says hello.
*
* @author Rob Winch
* @since 5.2
*/
@Controller
public class MessageController {
@MessageMapping("message")
public Mono<String> message() {
return Mono.just("Hello");
}
}

View File

@@ -0,0 +1,48 @@
/*
* Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.rsocket.EnableRSocketSecurity;
import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
/**
* Minimal RSocket Security configuration.
*
* @author Rob Winch
* @since 5.2
*/
@Configuration
@EnableRSocketSecurity
public class SecurityConfiguration {
@Bean
MapReactiveUserDetailsService userDetailsService() {
// @formatter:off
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("SETUP")
.build();
// @formatter:on
return new MapReactiveUserDetailsService(user);
}
}

View File

@@ -0,0 +1 @@
spring.rsocket.server.port=8080