Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

spring boot 3.1.0 updates #5

Merged
merged 22 commits into from
Jun 11, 2023
Merged
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
4 changes: 2 additions & 2 deletions hello-service/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.1'
id 'org.springframework.boot' version '3.1.0'
id 'io.spring.dependency-management' version '1.1.0'
}

Expand All @@ -18,7 +18,7 @@ repositories {
}

ext {
set('springCloudVersion', "2022.0.0")
set('springCloudVersion', "2022.0.3")
}

dependencies {
Expand Down
4 changes: 2 additions & 2 deletions hello-service/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-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
zipStorePath=wrapper/dists
2 changes: 1 addition & 1 deletion helm/spring-cloud-kubernetes-demo/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ appVersion: "1.16.0"

dependencies:
- name: redis
version: "15.7.2"
version: "17.11.3"
repository: "https://charts.bitnami.com/bitnami"

- name: mongodb
Expand Down
20 changes: 19 additions & 1 deletion helm/spring-cloud-kubernetes-demo/templates/ui-interface.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ metadata:
namespace: {{ .Release.Namespace }}
data:
application.yaml: |-
testValue: it is a test value
postLogoutUrl: {{ .Values.ui.postLogoutUrl }}
server:
forward-headers-strategy: framework

Expand All @@ -14,6 +14,24 @@ data:
redis:
host: {{ .Release.Namespace }}-redis-master


security:
oauth2:
client:
registration:
client:
client-id: {{ .Values.keycloak.sso.clientId }}
client-secret: {{ .Values.keycloak.sso.clientSecret }}
client-name: keycloak
provider: keycloak
scope:
- openid
authorization-grant-type: authorization_code
provider:
keycloak:
issuer-uri: {{ .Values.keycloak.tenantUrl }}
user-name-attribute: preferred_username

cloud:
gateway:
routes:
Expand Down
7 changes: 7 additions & 0 deletions helm/spring-cloud-kubernetes-demo/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,14 @@ helloService:
pullPolicy: Always
tag: latest

keycloak:
tenantUrl: http://keycloak.local
sso:
clientId: xxx
clientSecret: xxx

ui:
postLogoutUrl: http://localhost:8080
replicas: 2
image:
pullPolicy: Always
Expand Down
8 changes: 4 additions & 4 deletions message-service/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
id("org.springframework.boot") version "3.0.1"
id("org.springframework.boot") version "3.1.0"
id("io.spring.dependency-management") version "1.1.0"
kotlin("jvm") version "1.7.22"
kotlin("plugin.spring") version "1.7.22"
kotlin("jvm") version "1.8.21"
kotlin("plugin.spring") version "1.8.21"
}

group = "it.valeriovaudi"
Expand All @@ -14,7 +14,7 @@ repositories {
mavenCentral()
}

extra["springCloudVersion"] = "2022.0.0"
extra["springCloudVersion"] = "2022.0.3"

dependencies {
implementation("org.springframework.cloud:spring-cloud-starter-bootstrap")
Expand Down
4 changes: 2 additions & 2 deletions message-service/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-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
zipStorePath=wrapper/dists
8 changes: 6 additions & 2 deletions ui/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.1</version>
<version>3.1.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>it.valeriovaudi</groupId>
Expand All @@ -16,10 +16,14 @@

<properties>
<java.version>17</java.version>
<spring-cloud.version>2022.0.0</spring-cloud.version>
<spring-cloud.version>2022.0.3</spring-cloud.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
Expand Down
100 changes: 73 additions & 27 deletions ui/src/main/java/it/valeriovaudi/ui/UiApplication.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,29 @@
package it.valeriovaudi.ui;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.oauth2.client.oidc.userinfo.OidcReactiveOAuth2UserService;
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
import org.springframework.security.oauth2.client.oidc.web.server.logout.OidcClientInitiatedServerLogoutSuccessHandler;
import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository;
import org.springframework.security.oauth2.client.userinfo.ReactiveOAuth2UserService;
import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.oauth2.core.oidc.user.OidcUserAuthority;
import org.springframework.security.web.server.SecurityWebFilterChain;
import org.springframework.security.web.server.authentication.logout.ServerLogoutSuccessHandler;
import reactor.core.publisher.Mono;

import static java.util.Arrays.asList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@SpringBootApplication
public class UiApplication {
Expand All @@ -21,34 +34,67 @@ public static void main(String[] args) {

}

@EnableWebFluxSecurity
@Configuration(proxyBeanMethods = false)
class SecurityConfig {

private final ReactiveClientRegistrationRepository clientRegistrationRepository;

SecurityConfig(ReactiveClientRegistrationRepository clientRegistrationRepository) {
this.clientRegistrationRepository = clientRegistrationRepository;
}

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
return http.csrf().disable().authorizeExchange()
.pathMatchers("/index.html").hasRole("USER")
.pathMatchers("/messages.html").hasRole("ADMIN")
.anyExchange().permitAll()
.and().formLogin()
.and().logout()
.and().build();
public ReactiveOAuth2UserService<OidcUserRequest, OidcUser> oidcUserService() {
final OidcReactiveOAuth2UserService delegate = new OidcReactiveOAuth2UserService();


return (userRequest) -> {
// Delegate to the default implementation for loading a user
return delegate.loadUser(userRequest)
.flatMap((oidcUser) -> {
List<String> authorities = (List<String>) oidcUser.getClaimAsMap("realm_access").get("roles");
Set<OidcUserAuthority> oidcAuthorities = authorities.stream()
.map(SimpleGrantedAuthority::new)
.map(authority -> new OidcUserAuthority(authority.getAuthority(), oidcUser.getIdToken(), oidcUser.getUserInfo()))
.collect(Collectors.toSet());
return Mono.just(new DefaultOidcUser(oidcAuthorities, oidcUser.getIdToken(), oidcUser.getUserInfo()));
});
};

}

@Bean
public MapReactiveUserDetailsService userDetailsService() {
UserDetails user = User.builder()
.username("user")
.password("{noop}secret")
.roles("USER")
.build();

UserDetails admin = User.builder()
.username("admin")
.password("{noop}secret")
.roles("ADMIN")
.build();

return new MapReactiveUserDetailsService(asList(admin, user));
public SecurityWebFilterChain defaultSecurityFilterChain(
@Value("${postLogoutUrl}") String postLogoutUrl,
ServerHttpSecurity http) {
http.csrf(ServerHttpSecurity.CsrfSpec::disable);
http.headers(configurer -> configurer.frameOptions(ServerHttpSecurity.HeaderSpec.FrameOptionsSpec::disable));

http.oauth2Login(Customizer.withDefaults());
http.logout(logoutSpec -> {
logoutSpec.logoutSuccessHandler(oidcLogoutSuccessHandler(postLogoutUrl, clientRegistrationRepository));
});

http.authorizeExchange(
auth ->
auth
.pathMatchers("/").hasAuthority("USER")
.pathMatchers("/index.html").hasAuthority("USER")
.pathMatchers("/messages.html").hasAuthority("ADMIN")
.anyExchange().permitAll()
);

return http.build();
}
}

private ServerLogoutSuccessHandler oidcLogoutSuccessHandler(
String postLogoutUrl,
ReactiveClientRegistrationRepository clientRegistrationRepository
) {
OidcClientInitiatedServerLogoutSuccessHandler oidcLogoutSuccessHandler =
new OidcClientInitiatedServerLogoutSuccessHandler(clientRegistrationRepository);
oidcLogoutSuccessHandler.setPostLogoutRedirectUri(postLogoutUrl);
return oidcLogoutSuccessHandler;
}
}