Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
grpcVersion=1.76.0


springBootVersion=3.5.7
springCloudVersion=2025.0.0
springBootVersion=4.0.0
springCloudVersion=2025.1.0

gradleErrorPronePluginVersion=3.0.1
errorProneVersion=2.16
lombokVersion=1.18.24
lombokVersion=1.18.38

version=5.2.1-SNAPSHOT
version=6.0.0-SNAPSHOT
group=io.github.lognet
description=Spring Boot starter for Google RPC.
gitHubUrl=https\://github.com/LogNet/grpc-spring-boot-starter
Expand All @@ -25,4 +25,4 @@ org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAME
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \
--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \
--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
21 changes: 9 additions & 12 deletions grpc-spring-boot-starter-demo/build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import org.lognet.springboot.grpc.gradle.ReactiveFeature

buildscript {
ext.kotlin_version = '1.9.10'
ext.kotlin_version = '2.1.21'
repositories {
mavenCentral()
}
Expand Down Expand Up @@ -80,6 +80,7 @@ dependencies {
implementation "org.springframework.security:spring-security-config"
implementation "org.springframework.security:spring-security-oauth2-jose"
implementation "org.springframework.security:spring-security-oauth2-resource-server"
implementation "org.springframework.boot:spring-boot-security"
implementation 'org.springframework.boot:spring-boot-starter-validation'
compileOnly 'org.springframework:spring-tx'

Expand All @@ -89,21 +90,25 @@ dependencies {
implementation project(':grpc-spring-boot-starter')
implementation project(':grpc-client-spring-boot-starter')

testImplementation 'org.springframework.boot:spring-boot-starter-aop'
testImplementation 'org.springframework.boot:spring-boot-starter-aspectj'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.boot:spring-boot-resttestclient'
testImplementation 'com.github.stefanbirkner:system-rules:1.18.0'
testImplementation('org.springframework.cloud:spring-cloud-starter-consul-discovery')
testImplementation 'org.awaitility:awaitility:4.0.3'
testImplementation "org.springframework.cloud:spring-cloud-config-server"
testImplementation "org.springframework.cloud:spring-cloud-config-client"
testImplementation "org.springframework.cloud:spring-cloud-starter-bootstrap"

testImplementation "com.playtika.testcontainers:embedded-keycloak:3.1.11"
testImplementation "com.github.dasniko:testcontainers-keycloak:3.7.0"
testImplementation "com.playtika.testcontainers:embedded-consul:3.1.11"


testImplementation 'org.springframework.security:spring-security-core'
testImplementation "org.springframework.boot:spring-boot-security"
testImplementation "org.springframework.boot:spring-boot-security-oauth2-resource-server"
testImplementation "org.springframework.boot:spring-boot-validation"
testImplementation 'org.hamcrest:hamcrest:2.2'
testImplementation 'org.mockito:mockito-core:2.23.0'


pureNettyTestImplementation "io.grpc:grpc-netty"
Expand All @@ -120,7 +125,6 @@ dependencies {
reactiveTestImplementation "com.playtika.testcontainers:embedded-postgresql:3.1.11"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"


}

configurations.all {
Expand Down Expand Up @@ -150,10 +154,3 @@ compileTestKotlin {
jvmTarget = JavaVersion.VERSION_17
}
}







Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public class CustomSecurityTest extends GrpcServerTestBase {
public static class DemoGrpcSecurityConfig extends GrpcSecurityConfigurerAdapter {

@Override
public void configure(GrpcSecurity builder) throws Exception {
public void configure(GrpcSecurity builder) {
builder.authorizeRequests()
.withSecuredAnnotation()
.authenticationSchemeSelector(scheme ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
import org.lognet.springboot.grpc.GrpcServerTestBase;
import org.lognet.springboot.grpc.demo.DemoApp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.resttestclient.TestRestTemplate;
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ActiveProfiles;
Expand All @@ -27,6 +28,7 @@
, "spring.main.web-application-type=servlet"
})
@ActiveProfiles({"disable-security"})
@AutoConfigureTestRestTemplate
public class Issue295Test extends GrpcServerTestBase {


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@
import org.junit.ClassRule;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.lognet.springboot.grpc.autoconfigure.GRpcAutoConfiguration;
import org.lognet.springboot.grpc.autoconfigure.security.SecurityAutoConfiguration;
import org.lognet.springboot.grpc.configserver.ConfigServerTestApplication;
import org.lognet.springboot.grpc.demo.DemoApp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
Expand Down Expand Up @@ -61,14 +58,12 @@ public static void startConfigServer(Properties properties ) throws IOException,
}


server = SpringApplication.run(org.springframework.cloud.config.server.ConfigServerApplication.class,
server = SpringApplication.run(ConfigServerTestApplication.class,
"--server.port=" + configPort,
"--spring.autoconfigure.exclude="+Stream.of(GRpcAutoConfiguration.class,
OAuth2ResourceServerAutoConfiguration.class,
ManagementWebSecurityAutoConfiguration.class,
SecurityAutoConfiguration.class
)
.map(Class::getName).collect(Collectors.joining(",")),
"--spring.autoconfigure.exclude="+Stream.of(
"org.springframework.boot.security.oauth2.server.resource.autoconfigure.OAuth2ResourceServerAutoConfiguration",
"org.springframework.boot.security.autoconfigure.actuate.web.servlet.ManagementWebSecurityAutoConfiguration"
).collect(Collectors.joining(",")),
"--spring.cloud.consul.discovery.enabled=false",
"--spring.cloud.service-registry.enabled=false",
"--spring.cloud.service-registry.auto-registration.enabled=false",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ public UserDetails user() {


@Override
public void configure(GrpcSecurity builder) throws Exception {
public void configure(GrpcSecurity builder) {


final UserDetails user = builder.getApplicationContext().getBean(UserDetails.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.boot.test.system.OutputCaptureRule;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
Expand All @@ -37,7 +37,7 @@ public class GRpcServerBuilderConfigurerTest {
@Autowired
private GRpcServerBuilderConfigurer customGrpcServerBuilderConfigurer;

@MockBean(name = "anotherConfigurer")
@MockitoBean(name = "anotherConfigurer")
private GRpcServerBuilderConfigurer anotherConfigurer;

@Rule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
Expand Down Expand Up @@ -100,7 +100,7 @@ public Iterable<Tag> getTags(Status status, MethodDescriptor<?, ?> methodDescrip
}
}

@SpyBean
@MockitoSpyBean
private RequestAwareGRpcMetricsTagsContributor<GreeterOuterClass.Person> shouldNotBeInvoked;

@Autowired
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.lognet.springboot.grpc.demo.DemoApp;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
Expand All @@ -46,10 +46,15 @@ public Status handle(Object message, Status status, Exception exception, Metadat
}
};
}

@Bean
public HalfCloseInterceptor halfCloseInterceptor() {
return new HalfCloseInterceptor();
}
}
private GreeterGrpc.GreeterBlockingStub stub;

@SpyBean
@MockitoSpyBean
HalfCloseInterceptor halfCloseInterceptor;

private static Locale systemDefaultLocale;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package org.lognet.springboot.grpc.actuator;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
Expand All @@ -17,23 +15,23 @@
import org.lognet.springboot.grpc.TestConfig;
import org.lognet.springboot.grpc.demo.DemoApp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.health.Status;
import org.springframework.boot.health.contributor.Status;
import org.springframework.boot.resttestclient.TestRestTemplate;
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.node.ObjectNode;

import java.time.Duration;
import java.util.Optional;
import java.util.Set;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
Expand All @@ -51,6 +49,7 @@
, "spring.main.web-application-type=servlet"
})
@ActiveProfiles({"disable-security", "measure"})
@AutoConfigureTestRestTemplate
public class ActuatorTest extends GrpcServerTestBase {

@Autowired
Expand Down Expand Up @@ -112,8 +111,8 @@ protected void afterGreeting() throws Exception {
ResponseEntity<ObjectNode> metricsResponse = restTemplate.getForEntity("/actuator/metrics", ObjectNode.class);
assertEquals(HttpStatus.OK, metricsResponse.getStatusCode());
final String metricName = "grpc.server.calls";
final Optional<String> containsGrpcServerCallsMetric = StreamSupport.stream(Spliterators.spliteratorUnknownSize(metricsResponse.getBody().withArray("names")
.elements(), Spliterator.NONNULL), false)
final Optional<String> containsGrpcServerCallsMetric = metricsResponse.getBody().withArray("names")
.elements().stream()
.map(JsonNode::asText)
.filter(metricName::equals)
.findFirst();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.springframework.context.annotation.Import;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

import static org.junit.Assert.assertNotNull;
Expand All @@ -24,12 +25,13 @@
@ActiveProfiles("keycloack-test")
@RunWith(SpringRunner.class)
@Import({AllAuthConfigTest.TestCfg.class})
@ContextConfiguration(initializers = KeycloakContainerInitializer.class)
public class AllAuthConfigTest extends JwtAuthBaseTest {

@TestConfiguration
static class TestCfg extends GrpcSecurityConfigurerAdapter {
@Override
public void configure(GrpcSecurity builder) throws Exception {
public void configure(GrpcSecurity builder) {

builder.authorizeRequests()
.anyMethod().authenticated()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,9 @@ public class ConcurrentAuthConfigTest extends GrpcServerTestBase {
static class TestCfg extends GrpcSecurityConfigurerAdapter {

@Override
public void configure(GrpcSecurity builder) throws Exception {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
public void configure(GrpcSecurity builder) {
UserDetailsService users = new InMemoryUserDetailsManager(user1, user2);
provider.setUserDetailsService(users);
DaoAuthenticationProvider provider = new DaoAuthenticationProvider(users);
provider.setPasswordEncoder(NoOpPasswordEncoder.getInstance());

builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.lognet.springboot.grpc.demo.DemoApp;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

import static org.junit.Assert.assertNotNull;
Expand All @@ -18,6 +19,7 @@
@SpringBootTest(classes = DemoApp.class)
@ActiveProfiles("keycloack-test")
@RunWith(SpringRunner.class)
@ContextConfiguration(initializers = KeycloakContainerInitializer.class)
public class DefaultAuthConfigTest extends JwtAuthBaseTest {


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class DisabledSecuredAnnTest extends JwtAuthBaseTest {
@TestConfiguration
static class TestCfg extends GrpcSecurityConfigurerAdapter {
@Override
public void configure(GrpcSecurity builder) throws Exception {
public void configure(GrpcSecurity builder) {
builder.authorizeRequests().withoutSecuredAnnotation();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public static UserDetails admin() {


@Override
public void configure(GrpcSecurity builder) throws Exception {
public void configure(GrpcSecurity builder) {
builder
.authorizeRequests()
.methods(CustomServiceGrpc.getCustomMethod()).hasAnyRole("admin")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,29 @@
import org.lognet.springboot.grpc.HalfCloseInterceptor;
import org.lognet.springboot.grpc.demo.DemoApp;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest(
classes = DemoApp.class,
properties = "grpc.security.auth.fail-fast=false"
)
@RunWith(SpringRunner.class)
@Import(FailLateSecurityInterceptorTest.TestCfg.class)
public class FailLateSecurityInterceptorTest extends GrpcServerTestBase {
@SpyBean

@TestConfiguration
static class TestCfg {
@Bean
public HalfCloseInterceptor halfCloseInterceptor() {
return new HalfCloseInterceptor();
}
}

@MockitoSpyBean
HalfCloseInterceptor halfCloseInterceptor;

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

public class FailedAuthGrpcSecurityConfig extends GrpcSecurityConfigurerAdapter {
@Override
public void configure(GrpcSecurity builder) throws Exception {
public void configure(GrpcSecurity builder) {

builder.authorizeRequests()
.anyMethod().authenticated()
Expand Down
Loading