9 changed files with 197 additions and 2 deletions
@ -0,0 +1,44 @@
@@ -0,0 +1,44 @@
|
||||
/* |
||||
* Copyright 2012-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 org.springframework.boot.autoconfigure.security.rsocket; |
||||
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; |
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; |
||||
import org.springframework.boot.rsocket.server.ServerRSocketFactoryProcessor; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.security.config.annotation.rsocket.EnableRSocketSecurity; |
||||
import org.springframework.security.rsocket.core.SecuritySocketAcceptorInterceptor; |
||||
|
||||
/** |
||||
* {@link EnableAutoConfiguration Auto-configuration} for Spring Security for an RSocket |
||||
* server. |
||||
* |
||||
* @author Madhura Bhave |
||||
* @since 2.2.0 |
||||
*/ |
||||
@Configuration(proxyBeanMethods = false) |
||||
@EnableRSocketSecurity |
||||
@ConditionalOnClass(SecuritySocketAcceptorInterceptor.class) |
||||
public class RSocketSecurityAutoConfiguration { |
||||
|
||||
@Bean |
||||
ServerRSocketFactoryProcessor springSecurityRSocketSecurity(SecuritySocketAcceptorInterceptor interceptor) { |
||||
return (factory) -> factory.addSocketAcceptorPlugin(interceptor); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
/* |
||||
* Copyright 2012-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 org.springframework.boot.autoconfigure.security.rsocket; |
||||
|
||||
import java.util.List; |
||||
|
||||
import io.rsocket.RSocketFactory; |
||||
import org.junit.jupiter.api.Test; |
||||
import org.mockito.ArgumentCaptor; |
||||
import org.mockito.Mockito; |
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations; |
||||
import org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration; |
||||
import org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration; |
||||
import org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration; |
||||
import org.springframework.boot.rsocket.server.ServerRSocketFactoryProcessor; |
||||
import org.springframework.boot.test.context.FilteredClassLoader; |
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner; |
||||
import org.springframework.security.config.annotation.rsocket.RSocketSecurity; |
||||
import org.springframework.security.rsocket.core.SecuritySocketAcceptorInterceptor; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* Tests for {@link RSocketSecurityAutoConfiguration}. |
||||
* |
||||
* @author Madhura Bhave |
||||
*/ |
||||
class RSocketSecurityAutoConfigurationTests { |
||||
|
||||
private ApplicationContextRunner contextRunner = new ApplicationContextRunner().withConfiguration(AutoConfigurations |
||||
.of(ReactiveUserDetailsServiceAutoConfiguration.class, RSocketSecurityAutoConfiguration.class, |
||||
RSocketMessagingAutoConfiguration.class, RSocketStrategiesAutoConfiguration.class)); |
||||
|
||||
@Test |
||||
void autoConfigurationEnablesRSocketSecurity() { |
||||
this.contextRunner.run((context) -> assertThat(context.getBean(RSocketSecurity.class)).isNotNull()); |
||||
} |
||||
|
||||
@Test |
||||
void autoConfigurationIsConditionalOnSecuritySocketAcceptorInterceptorClass() { |
||||
this.contextRunner.withClassLoader(new FilteredClassLoader(SecuritySocketAcceptorInterceptor.class)) |
||||
.run((context) -> assertThat(context).doesNotHaveBean(RSocketSecurity.class)); |
||||
} |
||||
|
||||
@Test |
||||
void autoConfigurationAddsCustomizerForServerRSocketFactory() { |
||||
RSocketFactory.ServerRSocketFactory factory = Mockito.mock(RSocketFactory.ServerRSocketFactory.class); |
||||
ArgumentCaptor<SecuritySocketAcceptorInterceptor> captor = ArgumentCaptor |
||||
.forClass(SecuritySocketAcceptorInterceptor.class); |
||||
this.contextRunner.run((context) -> { |
||||
ServerRSocketFactoryProcessor customizer = context.getBean(ServerRSocketFactoryProcessor.class); |
||||
customizer.process(factory); |
||||
Mockito.verify(factory).addSocketAcceptorPlugin(captor.capture()); |
||||
List<SecuritySocketAcceptorInterceptor> values = captor.getAllValues(); |
||||
assertThat(values.get(0)).isInstanceOf(SecuritySocketAcceptorInterceptor.class); |
||||
}); |
||||
} |
||||
|
||||
} |
||||
@ -1 +1,2 @@
@@ -1 +1,2 @@
|
||||
spring.rsocket.server.port=0 |
||||
spring.security.user.password=password |
||||
|
||||
Loading…
Reference in new issue