Skip to content

Commit

Permalink
Merge pull request #5 from mrFlick72/modernization
Browse files Browse the repository at this point in the history
spring boot 3.1.0 updates
  • Loading branch information
mrFlick72 authored Jun 11, 2023
2 parents 58dccce + f41927f commit d0783ae
Show file tree
Hide file tree
Showing 8 changed files with 115 additions and 40 deletions.
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
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;
}
}

0 comments on commit d0783ae

Please sign in to comment.