diff --git a/.idea/misc.xml b/.idea/misc.xml index 5821b2f..7edc3a5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,5 +4,5 @@ - + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 5ab3f03..53c91c3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT org.gradle.jvmargs=-Xmx3g -XX:+HeapDumpOnOutOfMemoryError org.gradle.parallel=true org.gradle.caching=true diff --git a/reactive/rsocket/hello-security/build.gradle b/reactive/rsocket/hello-security/build.gradle index 30585ac..d188451 100644 --- a/reactive/rsocket/hello-security/build.gradle +++ b/reactive/rsocket/hello-security/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/reactive/rsocket/hello-security/gradle.properties b/reactive/rsocket/hello-security/gradle.properties index c924e36..ce1417e 100644 --- a/reactive/rsocket/hello-security/gradle.properties +++ b/reactive/rsocket/hello-security/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/reactive/webflux-fn/hello-security/build.gradle b/reactive/webflux-fn/hello-security/build.gradle index d500ed8..b5aae82 100644 --- a/reactive/webflux-fn/hello-security/build.gradle +++ b/reactive/webflux-fn/hello-security/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/reactive/webflux-fn/hello-security/gradle.properties b/reactive/webflux-fn/hello-security/gradle.properties index c924e36..ce1417e 100644 --- a/reactive/webflux-fn/hello-security/gradle.properties +++ b/reactive/webflux-fn/hello-security/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/reactive/webflux-fn/hello/build.gradle b/reactive/webflux-fn/hello/build.gradle index 444de4e..1e520af 100644 --- a/reactive/webflux-fn/hello/build.gradle +++ b/reactive/webflux-fn/hello/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/reactive/webflux-fn/hello/gradle.properties b/reactive/webflux-fn/hello/gradle.properties index c924e36..ce1417e 100644 --- a/reactive/webflux-fn/hello/gradle.properties +++ b/reactive/webflux-fn/hello/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/reactive/webflux/java/authentication/username-password/form/build.gradle b/reactive/webflux/java/authentication/username-password/form/build.gradle index 4ed2d27..40196ac 100644 --- a/reactive/webflux/java/authentication/username-password/form/build.gradle +++ b/reactive/webflux/java/authentication/username-password/form/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '2.6.4' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/reactive/webflux/java/authentication/username-password/form/gradle.properties b/reactive/webflux/java/authentication/username-password/form/gradle.properties index c924e36..e19a862 100644 --- a/reactive/webflux/java/authentication/username-password/form/gradle.properties +++ b/reactive/webflux/java/authentication/username-password/form/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=5.7.0-SNAPSHOT +spring-security.version=5.7.0-SNAPSHOT diff --git a/reactive/webflux/java/authentication/username-password/form/src/integTest/java/example/pages/LoginPage.java b/reactive/webflux/java/authentication/username-password/form/src/integTest/java/example/pages/LoginPage.java index 5773a37..298092d 100644 --- a/reactive/webflux/java/authentication/username-password/form/src/integTest/java/example/pages/LoginPage.java +++ b/reactive/webflux/java/authentication/username-password/form/src/integTest/java/example/pages/LoginPage.java @@ -70,8 +70,10 @@ public class LoginPage { private WebDriver driver; + @FindBy(id = "username") private WebElement username; + @FindBy(id = "password") private WebElement password; @FindBy(css = "button[type=submit]") diff --git a/reactive/webflux/java/authentication/x509/build.gradle b/reactive/webflux/java/authentication/x509/build.gradle index 90195b4..dd773f6 100644 --- a/reactive/webflux/java/authentication/x509/build.gradle +++ b/reactive/webflux/java/authentication/x509/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/reactive/webflux/java/authentication/x509/gradle.properties b/reactive/webflux/java/authentication/x509/gradle.properties index c924e36..ce1417e 100644 --- a/reactive/webflux/java/authentication/x509/gradle.properties +++ b/reactive/webflux/java/authentication/x509/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/reactive/webflux/java/hello-security-explicit/build.gradle b/reactive/webflux/java/hello-security-explicit/build.gradle index 7ef4928..4d34ec2 100644 --- a/reactive/webflux/java/hello-security-explicit/build.gradle +++ b/reactive/webflux/java/hello-security-explicit/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/reactive/webflux/java/hello-security-explicit/gradle.properties b/reactive/webflux/java/hello-security-explicit/gradle.properties index c924e36..ce1417e 100644 --- a/reactive/webflux/java/hello-security-explicit/gradle.properties +++ b/reactive/webflux/java/hello-security-explicit/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/reactive/webflux/java/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java b/reactive/webflux/java/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java index 60e0b3d..319e70c 100644 --- a/reactive/webflux/java/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java +++ b/reactive/webflux/java/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java @@ -51,8 +51,10 @@ public class LoginPage { private WebDriver webDriver; + @FindBy(id = "username") private WebElement username; + @FindBy(id = "password") private WebElement password; @FindBy(css = "button[type=submit]") diff --git a/reactive/webflux/java/hello-security/build.gradle b/reactive/webflux/java/hello-security/build.gradle index 0150ff3..3ac381e 100644 --- a/reactive/webflux/java/hello-security/build.gradle +++ b/reactive/webflux/java/hello-security/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/reactive/webflux/java/hello-security/gradle.properties b/reactive/webflux/java/hello-security/gradle.properties index c924e36..ce1417e 100644 --- a/reactive/webflux/java/hello-security/gradle.properties +++ b/reactive/webflux/java/hello-security/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/reactive/webflux/java/hello/build.gradle b/reactive/webflux/java/hello/build.gradle index 444de4e..1e520af 100644 --- a/reactive/webflux/java/hello/build.gradle +++ b/reactive/webflux/java/hello/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/reactive/webflux/java/hello/gradle.properties b/reactive/webflux/java/hello/gradle.properties index c924e36..ce1417e 100644 --- a/reactive/webflux/java/hello/gradle.properties +++ b/reactive/webflux/java/hello/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/reactive/webflux/java/method/build.gradle b/reactive/webflux/java/method/build.gradle index 680af93..80187bb 100644 --- a/reactive/webflux/java/method/build.gradle +++ b/reactive/webflux/java/method/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/reactive/webflux/java/method/gradle.properties b/reactive/webflux/java/method/gradle.properties index c924e36..ce1417e 100644 --- a/reactive/webflux/java/method/gradle.properties +++ b/reactive/webflux/java/method/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/reactive/webflux/java/oauth2/login/build.gradle b/reactive/webflux/java/oauth2/login/build.gradle index 3920308..225f9da 100644 --- a/reactive/webflux/java/oauth2/login/build.gradle +++ b/reactive/webflux/java/oauth2/login/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } @@ -15,7 +15,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-webflux' - implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' diff --git a/reactive/webflux/java/oauth2/login/gradle.properties b/reactive/webflux/java/oauth2/login/gradle.properties index c924e36..ce1417e 100644 --- a/reactive/webflux/java/oauth2/login/gradle.properties +++ b/reactive/webflux/java/oauth2/login/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/reactive/webflux/java/oauth2/resource-server/build.gradle b/reactive/webflux/java/oauth2/resource-server/build.gradle index 0274f0d..7f6573e 100644 --- a/reactive/webflux/java/oauth2/resource-server/build.gradle +++ b/reactive/webflux/java/oauth2/resource-server/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/reactive/webflux/java/oauth2/resource-server/gradle.properties b/reactive/webflux/java/oauth2/resource-server/gradle.properties index c924e36..ce1417e 100644 --- a/reactive/webflux/java/oauth2/resource-server/gradle.properties +++ b/reactive/webflux/java/oauth2/resource-server/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/reactive/webflux/java/oauth2/webclient/build.gradle b/reactive/webflux/java/oauth2/webclient/build.gradle index c80b454..7adb7cc 100644 --- a/reactive/webflux/java/oauth2/webclient/build.gradle +++ b/reactive/webflux/java/oauth2/webclient/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } @@ -15,7 +15,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' implementation 'org.springframework:spring-webflux' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' - implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' implementation 'io.projectreactor.netty:reactor-netty' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/reactive/webflux/java/oauth2/webclient/gradle.properties b/reactive/webflux/java/oauth2/webclient/gradle.properties index c924e36..ce1417e 100644 --- a/reactive/webflux/java/oauth2/webclient/gradle.properties +++ b/reactive/webflux/java/oauth2/webclient/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/reactive/webflux/kotlin/hello-security/build.gradle.kts b/reactive/webflux/kotlin/hello-security/build.gradle.kts index 58b7dbb..d9261b4 100644 --- a/reactive/webflux/kotlin/hello-security/build.gradle.kts +++ b/reactive/webflux/kotlin/hello-security/build.gradle.kts @@ -1,8 +1,8 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - id("org.springframework.boot") version "2.5.0" - id("io.spring.dependency-management") version "1.0.9.RELEASE" + id("org.springframework.boot") version "3.0.0-M1" + id("io.spring.dependency-management") version "1.0.11.RELEASE" kotlin("jvm") version "1.6.0" kotlin("plugin.spring") version "1.6.0" } @@ -12,13 +12,16 @@ repositories { maven { url = uri("https://repo.spring.io/snapshot") } + maven { + url = uri("https://repo.spring.io/milestone") + } } dependencies { implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-thymeleaf") implementation("org.springframework.boot:spring-boot-starter-webflux") - implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity5") + implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity6") implementation("io.projectreactor.kotlin:reactor-kotlin-extensions") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") @@ -40,4 +43,4 @@ tasks.withType { tasks.withType { useJUnitPlatform() -} \ No newline at end of file +} diff --git a/reactive/webflux/kotlin/hello-security/gradle.properties b/reactive/webflux/kotlin/hello-security/gradle.properties index 778a95c..a37772a 100644 --- a/reactive/webflux/kotlin/hello-security/gradle.properties +++ b/reactive/webflux/kotlin/hello-security/gradle.properties @@ -1 +1 @@ -spring-security.version=5.6.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/java-configuration/authentication/username-password/form/build.gradle b/servlet/java-configuration/authentication/username-password/form/build.gradle index 57a935c..27928f9 100644 --- a/servlet/java-configuration/authentication/username-password/form/build.gradle +++ b/servlet/java-configuration/authentication/username-password/form/build.gradle @@ -1,7 +1,7 @@ plugins { id "java" id "nebula.integtest" version "8.2.0" - id "org.gretty" version "3.0.6" + id "org.gretty" version "4.0.0" id "war" } @@ -14,14 +14,14 @@ repositories { } dependencies { - implementation platform("org.springframework:spring-framework-bom:5.3.0") - implementation platform("org.springframework.security:spring-security-bom:5.5.0-SNAPSHOT") + implementation platform("org.springframework:spring-framework-bom:6.0.0-SNAPSHOT") + implementation platform("org.springframework.security:spring-security-bom:6.0.0-SNAPSHOT") implementation platform("org.junit:junit-bom:5.7.0") implementation "org.springframework.security:spring-security-config" implementation "org.springframework.security:spring-security-web" implementation "org.springframework:spring-webmvc" - implementation "org.thymeleaf:thymeleaf-spring5:3.0.11.RELEASE" + implementation "org.thymeleaf:thymeleaf-spring6:3.1.0.M1" testImplementation "org.assertj:assertj-core:3.18.0" testImplementation "org.springframework:spring-test" diff --git a/servlet/java-configuration/authentication/username-password/form/gradle/gretty.gradle b/servlet/java-configuration/authentication/username-password/form/gradle/gretty.gradle index 6949bdf..3428615 100644 --- a/servlet/java-configuration/authentication/username-password/form/gradle/gretty.gradle +++ b/servlet/java-configuration/authentication/username-password/form/gradle/gretty.gradle @@ -1,5 +1,5 @@ gretty { - servletContainer = "tomcat9" + servletContainer = "tomcat10" contextPath = "/" fileLogEnabled = false integrationTestTask = 'integrationTest' @@ -38,4 +38,4 @@ project.tasks.matching { it.name == "integrationTest" }.all { integrationTest.systemProperty 'app.httpBaseURI', httpBaseUrl integrationTest.systemProperty 'app.httpsBaseURI', httpsBaseUrl } -} \ No newline at end of file +} diff --git a/servlet/java-configuration/authentication/username-password/form/src/main/java/example/MvcWebApplicationInitializer.java b/servlet/java-configuration/authentication/username-password/form/src/main/java/example/MvcWebApplicationInitializer.java index a45eec0..5679405 100644 --- a/servlet/java-configuration/authentication/username-password/form/src/main/java/example/MvcWebApplicationInitializer.java +++ b/servlet/java-configuration/authentication/username-password/form/src/main/java/example/MvcWebApplicationInitializer.java @@ -16,7 +16,7 @@ package example; -import javax.servlet.Filter; +import jakarta.servlet.Filter; import org.springframework.web.filter.HiddenHttpMethodFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; diff --git a/servlet/java-configuration/authentication/username-password/form/src/main/java/example/WebMvcConfiguration.java b/servlet/java-configuration/authentication/username-password/form/src/main/java/example/WebMvcConfiguration.java index 9c01f78..3e18741 100644 --- a/servlet/java-configuration/authentication/username-password/form/src/main/java/example/WebMvcConfiguration.java +++ b/servlet/java-configuration/authentication/username-password/form/src/main/java/example/WebMvcConfiguration.java @@ -16,10 +16,10 @@ package example; -import org.thymeleaf.spring5.ISpringTemplateEngine; -import org.thymeleaf.spring5.SpringTemplateEngine; -import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver; -import org.thymeleaf.spring5.view.ThymeleafViewResolver; +import org.thymeleaf.spring6.ISpringTemplateEngine; +import org.thymeleaf.spring6.SpringTemplateEngine; +import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver; +import org.thymeleaf.spring6.view.ThymeleafViewResolver; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.ITemplateResolver; diff --git a/servlet/java-configuration/authentication/x509/build.gradle b/servlet/java-configuration/authentication/x509/build.gradle index 1eda48b..2268004 100644 --- a/servlet/java-configuration/authentication/x509/build.gradle +++ b/servlet/java-configuration/authentication/x509/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "nebula.integtest" version "8.2.0" +// id "nebula.integtest" version "8.2.0" id "org.gretty" version "3.0.6" id "war" } diff --git a/servlet/java-configuration/hello-mvc-security/build.gradle b/servlet/java-configuration/hello-mvc-security/build.gradle index 57a935c..27928f9 100644 --- a/servlet/java-configuration/hello-mvc-security/build.gradle +++ b/servlet/java-configuration/hello-mvc-security/build.gradle @@ -1,7 +1,7 @@ plugins { id "java" id "nebula.integtest" version "8.2.0" - id "org.gretty" version "3.0.6" + id "org.gretty" version "4.0.0" id "war" } @@ -14,14 +14,14 @@ repositories { } dependencies { - implementation platform("org.springframework:spring-framework-bom:5.3.0") - implementation platform("org.springframework.security:spring-security-bom:5.5.0-SNAPSHOT") + implementation platform("org.springframework:spring-framework-bom:6.0.0-SNAPSHOT") + implementation platform("org.springframework.security:spring-security-bom:6.0.0-SNAPSHOT") implementation platform("org.junit:junit-bom:5.7.0") implementation "org.springframework.security:spring-security-config" implementation "org.springframework.security:spring-security-web" implementation "org.springframework:spring-webmvc" - implementation "org.thymeleaf:thymeleaf-spring5:3.0.11.RELEASE" + implementation "org.thymeleaf:thymeleaf-spring6:3.1.0.M1" testImplementation "org.assertj:assertj-core:3.18.0" testImplementation "org.springframework:spring-test" diff --git a/servlet/java-configuration/hello-mvc-security/gradle/gretty.gradle b/servlet/java-configuration/hello-mvc-security/gradle/gretty.gradle index 6949bdf..3428615 100644 --- a/servlet/java-configuration/hello-mvc-security/gradle/gretty.gradle +++ b/servlet/java-configuration/hello-mvc-security/gradle/gretty.gradle @@ -1,5 +1,5 @@ gretty { - servletContainer = "tomcat9" + servletContainer = "tomcat10" contextPath = "/" fileLogEnabled = false integrationTestTask = 'integrationTest' @@ -38,4 +38,4 @@ project.tasks.matching { it.name == "integrationTest" }.all { integrationTest.systemProperty 'app.httpBaseURI', httpBaseUrl integrationTest.systemProperty 'app.httpsBaseURI', httpsBaseUrl } -} \ No newline at end of file +} diff --git a/servlet/java-configuration/hello-mvc-security/src/integTest/java/example/pages/LoginPage.java b/servlet/java-configuration/hello-mvc-security/src/integTest/java/example/pages/LoginPage.java index 25bcec3..3ef69d0 100644 --- a/servlet/java-configuration/hello-mvc-security/src/integTest/java/example/pages/LoginPage.java +++ b/servlet/java-configuration/hello-mvc-security/src/integTest/java/example/pages/LoginPage.java @@ -51,8 +51,10 @@ public class LoginPage { private WebDriver webDriver; + @FindBy(id = "username") private WebElement username; + @FindBy(id = "password") private WebElement password; @FindBy(css = "button[type=submit]") diff --git a/servlet/java-configuration/hello-mvc-security/src/main/java/example/MvcWebApplicationInitializer.java b/servlet/java-configuration/hello-mvc-security/src/main/java/example/MvcWebApplicationInitializer.java index a45eec0..5679405 100644 --- a/servlet/java-configuration/hello-mvc-security/src/main/java/example/MvcWebApplicationInitializer.java +++ b/servlet/java-configuration/hello-mvc-security/src/main/java/example/MvcWebApplicationInitializer.java @@ -16,7 +16,7 @@ package example; -import javax.servlet.Filter; +import jakarta.servlet.Filter; import org.springframework.web.filter.HiddenHttpMethodFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; diff --git a/servlet/java-configuration/hello-mvc-security/src/main/java/example/WebMvcConfiguration.java b/servlet/java-configuration/hello-mvc-security/src/main/java/example/WebMvcConfiguration.java index 9c01f78..3e18741 100644 --- a/servlet/java-configuration/hello-mvc-security/src/main/java/example/WebMvcConfiguration.java +++ b/servlet/java-configuration/hello-mvc-security/src/main/java/example/WebMvcConfiguration.java @@ -16,10 +16,10 @@ package example; -import org.thymeleaf.spring5.ISpringTemplateEngine; -import org.thymeleaf.spring5.SpringTemplateEngine; -import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver; -import org.thymeleaf.spring5.view.ThymeleafViewResolver; +import org.thymeleaf.spring6.ISpringTemplateEngine; +import org.thymeleaf.spring6.SpringTemplateEngine; +import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver; +import org.thymeleaf.spring6.view.ThymeleafViewResolver; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.ITemplateResolver; diff --git a/servlet/java-configuration/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java b/servlet/java-configuration/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java index 25bcec3..3ef69d0 100644 --- a/servlet/java-configuration/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java +++ b/servlet/java-configuration/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java @@ -51,8 +51,10 @@ public class LoginPage { private WebDriver webDriver; + @FindBy(id = "username") private WebElement username; + @FindBy(id = "password") private WebElement password; @FindBy(css = "button[type=submit]") diff --git a/servlet/java-configuration/saml2/login/build.gradle b/servlet/java-configuration/saml2/login/build.gradle index 65cb823..8be8ca2 100644 --- a/servlet/java-configuration/saml2/login/build.gradle +++ b/servlet/java-configuration/saml2/login/build.gradle @@ -36,21 +36,19 @@ dependencies { implementation "org.opensaml:opensaml-saml-api:4.1.1" implementation "org.opensaml:opensaml-saml-impl:4.1.1" } - implementation platform("org.springframework:spring-framework-bom:5.3.11") - implementation platform("org.springframework.security:spring-security-bom:5.6.0-SNAPSHOT") + implementation platform("org.springframework:spring-framework-bom:6.0.0-SNAPSHOT") + implementation platform("org.springframework.security:spring-security-bom:6.0.0-SNAPSHOT") implementation platform("org.junit:junit-bom:5.7.0") implementation "org.springframework.security:spring-security-config" implementation "org.springframework.security:spring-security-web" implementation "org.springframework:spring-webmvc" implementation "org.springframework.security:spring-security-saml2-service-provider" - implementation "javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:1.2.2" - implementation "org.apache.taglibs:taglibs-standard-jstlel:1.2.5" - implementation "org.thymeleaf:thymeleaf-spring5:3.0.11.RELEASE" - implementation "org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.0.4.RELEASE" + implementation "org.thymeleaf:thymeleaf-spring6:3.1.0.M1" + implementation "org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.0.M1" - providedCompile "javax.servlet:javax.servlet-api:4.0.1" - providedCompile "javax.servlet.jsp:javax.servlet.jsp-api:2.3.3" + providedCompile "jakarta.servlet:jakarta.servlet-api:5.0.0" + providedCompile "org.glassfish.web:jakarta.servlet.jsp.jstl:2.0.0" testImplementation "org.assertj:assertj-core:3.18.0" testImplementation "org.springframework:spring-test" @@ -58,6 +56,7 @@ dependencies { testImplementation("org.junit.jupiter:junit-jupiter-api") testImplementation "org.seleniumhq.selenium:htmlunit-driver:2.44.0" testImplementation 'org.hamcrest:hamcrest:2.2' + testImplementation 'org.awaitility:awaitility:4.2.0' testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") } diff --git a/servlet/java-configuration/saml2/login/src/integTest/java/example/Saml2JavaConfigurationITests.java b/servlet/java-configuration/saml2/login/src/integTest/java/example/Saml2JavaConfigurationITests.java index 3cd5ac1..8e31aaa 100644 --- a/servlet/java-configuration/saml2/login/src/integTest/java/example/Saml2JavaConfigurationITests.java +++ b/servlet/java-configuration/saml2/login/src/integTest/java/example/Saml2JavaConfigurationITests.java @@ -16,15 +16,16 @@ package example; -import java.io.IOException; +import java.util.concurrent.TimeUnit; +import com.gargoylesoftware.htmlunit.ElementNotFoundException; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlInput; import com.gargoylesoftware.htmlunit.html.HtmlPage; +import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput; import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -40,6 +41,9 @@ import org.springframework.test.web.servlet.htmlunit.MockMvcWebClientBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = ApplicationConfiguration.class) @WebAppConfiguration @@ -66,35 +70,47 @@ public class Saml2JavaConfigurationITests { @Test void authenticationAttemptWhenValidThenShowsUserEmailAddress() throws Exception { - HtmlPage relyingParty = performLogin(); - Assertions.assertThat(relyingParty.asText()).contains("You're email address is testuser@spring.security.saml"); + performLogin(); + HtmlPage home = (HtmlPage) this.webClient.getCurrentWindow().getEnclosedPage(); + assertThat(home.asText()).contains("You're email address is testuser@spring.security.saml"); } @Test void logoutWhenRelyingPartyInitiatedLogoutThenLoginPageWithLogoutParam() throws Exception { - HtmlPage relyingParty = performLogin(); - HtmlElement rpLogoutButton = relyingParty.getHtmlElementById("rp_logout_button"); + performLogin(); + HtmlPage home = (HtmlPage) this.webClient.getCurrentWindow().getEnclosedPage(); + HtmlElement rpLogoutButton = home.getHtmlElementById("rp_logout_button"); HtmlPage loginPage = rpLogoutButton.click(); - Assertions.assertThat(loginPage.getUrl().getFile()).isEqualTo("/login?logout"); + assertThat(loginPage.getUrl().getFile()).isEqualTo("/login?logout"); } - @Test - void logoutWhenAssertingPartyInitiatedLogoutThenLoginPageWithLogoutParam() throws Exception { - HtmlPage relyingParty = performLogin(); - HtmlElement apLogoutButton = relyingParty.getHtmlElementById("ap_logout_button"); - HtmlPage loginPage = apLogoutButton.click(); - Assertions.assertThat(loginPage.getUrl().getFile()).isEqualTo("/login?logout"); - } - - private HtmlPage performLogin() throws IOException { + private void performLogin() throws Exception { HtmlPage login = this.webClient.getPage("/"); - HtmlForm form = login.getFormByName("f"); + this.webClient.waitForBackgroundJavaScript(10000); + HtmlForm form = findForm(login); HtmlInput username = form.getInputByName("username"); - HtmlInput password = form.getInputByName("password"); - HtmlSubmitInput submit = login.getHtmlElementById("submit_button"); - username.setValueAttribute("user"); - password.setValueAttribute("password"); - return submit.click(); + HtmlPasswordInput password = form.getInputByName("password"); + HtmlSubmitInput submit = login.getHtmlElementById("okta-signin-submit"); + username.type("testuser@spring.security.saml"); + password.type("12345678"); + submit.click(); + this.webClient.waitForBackgroundJavaScript(10000); + } + + private HtmlForm findForm(HtmlPage login) { + await().atMost(10, TimeUnit.SECONDS) + .until(() -> login.getForms().stream().map(HtmlForm::getId).anyMatch("form19"::equals)); + for (HtmlForm form : login.getForms()) { + try { + if (form.getId().equals("form19")) { + return form; + } + } + catch (ElementNotFoundException ex) { + // Continue + } + } + throw new IllegalStateException("Could not resolve login form"); } } diff --git a/servlet/java-configuration/saml2/login/src/main/java/example/MvcWebApplicationInitializer.java b/servlet/java-configuration/saml2/login/src/main/java/example/MvcWebApplicationInitializer.java index a45eec0..5679405 100644 --- a/servlet/java-configuration/saml2/login/src/main/java/example/MvcWebApplicationInitializer.java +++ b/servlet/java-configuration/saml2/login/src/main/java/example/MvcWebApplicationInitializer.java @@ -16,7 +16,7 @@ package example; -import javax.servlet.Filter; +import jakarta.servlet.Filter; import org.springframework.web.filter.HiddenHttpMethodFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; diff --git a/servlet/java-configuration/saml2/login/src/main/java/example/WebMvcConfiguration.java b/servlet/java-configuration/saml2/login/src/main/java/example/WebMvcConfiguration.java index 9bf0279..4e2bac4 100644 --- a/servlet/java-configuration/saml2/login/src/main/java/example/WebMvcConfiguration.java +++ b/servlet/java-configuration/saml2/login/src/main/java/example/WebMvcConfiguration.java @@ -16,11 +16,11 @@ package example; -import org.thymeleaf.extras.springsecurity5.dialect.SpringSecurityDialect; -import org.thymeleaf.spring5.ISpringTemplateEngine; -import org.thymeleaf.spring5.SpringTemplateEngine; -import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver; -import org.thymeleaf.spring5.view.ThymeleafViewResolver; +import org.thymeleaf.extras.springsecurity6.dialect.SpringSecurityDialect; +import org.thymeleaf.spring6.ISpringTemplateEngine; +import org.thymeleaf.spring6.SpringTemplateEngine; +import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver; +import org.thymeleaf.spring6.view.ThymeleafViewResolver; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.ITemplateResolver; diff --git a/servlet/spring-boot/java/authentication/username-password/mfa/build.gradle b/servlet/spring-boot/java/authentication/username-password/mfa/build.gradle index ac0000e..f626778 100644 --- a/servlet/spring-boot/java/authentication/username-password/mfa/build.gradle +++ b/servlet/spring-boot/java/authentication/username-password/mfa/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'io.spring.dependency-management' version '1.0.10.RELEASE' - id 'org.springframework.boot' version '2.5.2' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/servlet/spring-boot/java/authentication/username-password/mfa/gradle.properties b/servlet/spring-boot/java/authentication/username-password/mfa/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/authentication/username-password/mfa/gradle.properties +++ b/servlet/spring-boot/java/authentication/username-password/mfa/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/authentication/username-password/mfa/src/main/java/example/MfaAuthenticationHandler.java b/servlet/spring-boot/java/authentication/username-password/mfa/src/main/java/example/MfaAuthenticationHandler.java index 5e4f57d..8187a89 100644 --- a/servlet/spring-boot/java/authentication/username-password/mfa/src/main/java/example/MfaAuthenticationHandler.java +++ b/servlet/spring-boot/java/authentication/username-password/mfa/src/main/java/example/MfaAuthenticationHandler.java @@ -18,9 +18,9 @@ package example; import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; diff --git a/servlet/spring-boot/java/authentication/username-password/mfa/src/main/java/example/MfaController.java b/servlet/spring-boot/java/authentication/username-password/mfa/src/main/java/example/MfaController.java index d956bd3..42846e6 100644 --- a/servlet/spring-boot/java/authentication/username-password/mfa/src/main/java/example/MfaController.java +++ b/servlet/spring-boot/java/authentication/username-password/mfa/src/main/java/example/MfaController.java @@ -18,8 +18,8 @@ package example; import java.security.SecureRandom; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/servlet/spring-boot/java/authentication/username-password/mfa/src/test/java/example/MfaApplicationTests.java b/servlet/spring-boot/java/authentication/username-password/mfa/src/test/java/example/MfaApplicationTests.java index 55d4b3b..b8e6d7e 100644 --- a/servlet/spring-boot/java/authentication/username-password/mfa/src/test/java/example/MfaApplicationTests.java +++ b/servlet/spring-boot/java/authentication/username-password/mfa/src/test/java/example/MfaApplicationTests.java @@ -15,9 +15,8 @@ */ package example; -import javax.servlet.http.HttpSession; - import com.j256.twofactorauth.TimeBasedOneTimePasswordUtil; +import jakarta.servlet.http.HttpSession; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/servlet/spring-boot/java/authentication/username-password/user-details-service/custom-user/build.gradle b/servlet/spring-boot/java/authentication/username-password/user-details-service/custom-user/build.gradle index b340e08..5340f91 100644 --- a/servlet/spring-boot/java/authentication/username-password/user-details-service/custom-user/build.gradle +++ b/servlet/spring-boot/java/authentication/username-password/user-details-service/custom-user/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'io.spring.dependency-management' version '1.0.10.RELEASE' - id 'org.springframework.boot' version '2.5.2' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/servlet/spring-boot/java/authentication/username-password/user-details-service/custom-user/gradle.properties b/servlet/spring-boot/java/authentication/username-password/user-details-service/custom-user/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/authentication/username-password/user-details-service/custom-user/gradle.properties +++ b/servlet/spring-boot/java/authentication/username-password/user-details-service/custom-user/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/hello-security-explicit/build.gradle b/servlet/spring-boot/java/hello-security-explicit/build.gradle index a35be68..880c19a 100644 --- a/servlet/spring-boot/java/hello-security-explicit/build.gradle +++ b/servlet/spring-boot/java/hello-security-explicit/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'io.spring.dependency-management' version '1.0.10.RELEASE' - id 'org.springframework.boot' version '2.5.2' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/servlet/spring-boot/java/hello-security-explicit/gradle.properties b/servlet/spring-boot/java/hello-security-explicit/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/hello-security-explicit/gradle.properties +++ b/servlet/spring-boot/java/hello-security-explicit/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java b/servlet/spring-boot/java/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java index 60e0b3d..319e70c 100644 --- a/servlet/spring-boot/java/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java +++ b/servlet/spring-boot/java/hello-security-explicit/src/integTest/java/example/pages/LoginPage.java @@ -51,8 +51,10 @@ public class LoginPage { private WebDriver webDriver; + @FindBy(id = "username") private WebElement username; + @FindBy(id = "password") private WebElement password; @FindBy(css = "button[type=submit]") diff --git a/servlet/spring-boot/java/hello-security/build.gradle b/servlet/spring-boot/java/hello-security/build.gradle index 0040ffb..1d4cea9 100644 --- a/servlet/spring-boot/java/hello-security/build.gradle +++ b/servlet/spring-boot/java/hello-security/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'io.spring.dependency-management' version '1.0.10.RELEASE' - id 'org.springframework.boot' version '2.5.2' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/servlet/spring-boot/java/hello-security/gradle.properties b/servlet/spring-boot/java/hello-security/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/hello-security/gradle.properties +++ b/servlet/spring-boot/java/hello-security/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/hello-security/settings.gradle b/servlet/spring-boot/java/hello-security/settings.gradle index 8b13789..e69de29 100644 --- a/servlet/spring-boot/java/hello-security/settings.gradle +++ b/servlet/spring-boot/java/hello-security/settings.gradle @@ -1 +0,0 @@ - diff --git a/servlet/spring-boot/java/hello/build.gradle b/servlet/spring-boot/java/hello/build.gradle index a1baa10..5e4f518 100644 --- a/servlet/spring-boot/java/hello/build.gradle +++ b/servlet/spring-boot/java/hello/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/servlet/spring-boot/java/hello/gradle.properties b/servlet/spring-boot/java/hello/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/hello/gradle.properties +++ b/servlet/spring-boot/java/hello/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/jwt/login/build.gradle b/servlet/spring-boot/java/jwt/login/build.gradle index 3f92f0e..ff109f9 100644 --- a/servlet/spring-boot/java/jwt/login/build.gradle +++ b/servlet/spring-boot/java/jwt/login/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } diff --git a/servlet/spring-boot/java/jwt/login/gradle.properties b/servlet/spring-boot/java/jwt/login/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/jwt/login/gradle.properties +++ b/servlet/spring-boot/java/jwt/login/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/ldap/build.gradle b/servlet/spring-boot/java/ldap/build.gradle index 90aeaae..9ffc99c 100644 --- a/servlet/spring-boot/java/ldap/build.gradle +++ b/servlet/spring-boot/java/ldap/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } diff --git a/servlet/spring-boot/java/ldap/gradle.properties b/servlet/spring-boot/java/ldap/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/ldap/gradle.properties +++ b/servlet/spring-boot/java/ldap/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/oauth2/authorization-server/build.gradle b/servlet/spring-boot/java/oauth2/authorization-server/build.gradle index f7a47d8..e05bf17 100644 --- a/servlet/spring-boot/java/oauth2/authorization-server/build.gradle +++ b/servlet/spring-boot/java/oauth2/authorization-server/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '2.6.4' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/servlet/spring-boot/java/oauth2/authorization-server/gradle.properties b/servlet/spring-boot/java/oauth2/authorization-server/gradle.properties index c924e36..e19a862 100644 --- a/servlet/spring-boot/java/oauth2/authorization-server/gradle.properties +++ b/servlet/spring-boot/java/oauth2/authorization-server/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=5.7.0-SNAPSHOT +spring-security.version=5.7.0-SNAPSHOT diff --git a/servlet/spring-boot/java/oauth2/login/build.gradle b/servlet/spring-boot/java/oauth2/login/build.gradle index 7afaf82..10ffa1e 100644 --- a/servlet/spring-boot/java/oauth2/login/build.gradle +++ b/servlet/spring-boot/java/oauth2/login/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } @@ -15,7 +15,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' diff --git a/servlet/spring-boot/java/oauth2/login/gradle.properties b/servlet/spring-boot/java/oauth2/login/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/oauth2/login/gradle.properties +++ b/servlet/spring-boot/java/oauth2/login/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/oauth2/login/src/integTest/java/example/OAuth2LoginApplicationTests.java b/servlet/spring-boot/java/oauth2/login/src/integTest/java/example/OAuth2LoginApplicationTests.java index 5f44272..3eda5f2 100644 --- a/servlet/spring-boot/java/oauth2/login/src/integTest/java/example/OAuth2LoginApplicationTests.java +++ b/servlet/spring-boot/java/oauth2/login/src/integTest/java/example/OAuth2LoginApplicationTests.java @@ -225,7 +225,7 @@ public class OAuth2LoginApplicationTests { HtmlElement errorElement = page.getBody().getFirstByXPath("div"); assertThat(errorElement).isNotNull(); - assertThat(errorElement.asText()).contains("authorization_request_not_found"); + assertThat(errorElement.asNormalizedText()).contains("authorization_request_not_found"); } @Test @@ -253,7 +253,7 @@ public class OAuth2LoginApplicationTests { HtmlElement errorElement = page.getBody().getFirstByXPath("div"); assertThat(errorElement).isNotNull(); - assertThat(errorElement.asText()).contains("authorization_request_not_found"); + assertThat(errorElement.asNormalizedText()).contains("authorization_request_not_found"); } @Test @@ -291,7 +291,7 @@ public class OAuth2LoginApplicationTests { assertThat(clientAnchorElements.get(i).getAttribute("href")).isIn(googleClientAuthorizeUri, githubClientAuthorizeUri, facebookClientAuthorizeUri, oktaClientAuthorizeUri, springClientAuthorizeUri); - assertThat(clientAnchorElements.get(i).asText()).isIn(googleClientRegistration.getClientName(), + assertThat(clientAnchorElements.get(i).asNormalizedText()).isIn(googleClientRegistration.getClientName(), githubClientRegistration.getClientName(), facebookClientRegistration.getClientName(), oktaClientRegistration.getClientName(), springClientRegistration.getClientName()); } @@ -301,13 +301,14 @@ public class OAuth2LoginApplicationTests { assertThat(page.getTitleText()).isEqualTo("Spring Security - OAuth 2.0 Login"); DomNodeList divElements = page.getBody().getElementsByTagName("div"); - assertThat(divElements.get(1).asText()).contains("User: joeg@springsecurity.io"); - assertThat(divElements.get(4).asText()).contains("You are successfully logged in joeg@springsecurity.io"); + assertThat(divElements.get(1).asNormalizedText()).contains("User: joeg@springsecurity.io"); + assertThat(divElements.get(4).asNormalizedText()) + .contains("You are successfully logged in joeg@springsecurity.io"); } private HtmlAnchor getClientAnchorElement(HtmlPage page, ClientRegistration clientRegistration) { Optional clientAnchorElement = page.getAnchors().stream() - .filter((e) -> e.asText().equals(clientRegistration.getClientName())).findFirst(); + .filter((e) -> e.asNormalizedText().equals(clientRegistration.getClientName())).findFirst(); return (clientAnchorElement.orElse(null)); } diff --git a/servlet/spring-boot/java/oauth2/login/src/main/java/example/filter/LoopbackIpRedirectFilter.java b/servlet/spring-boot/java/oauth2/login/src/main/java/example/filter/LoopbackIpRedirectFilter.java index d9f00e5..4b22949 100644 --- a/servlet/spring-boot/java/oauth2/login/src/main/java/example/filter/LoopbackIpRedirectFilter.java +++ b/servlet/spring-boot/java/oauth2/login/src/main/java/example/filter/LoopbackIpRedirectFilter.java @@ -18,10 +18,10 @@ package example.filter; import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; diff --git a/servlet/spring-boot/java/oauth2/resource-server/hello-security/build.gradle b/servlet/spring-boot/java/oauth2/resource-server/hello-security/build.gradle index d64e474..cb4dae4 100644 --- a/servlet/spring-boot/java/oauth2/resource-server/hello-security/build.gradle +++ b/servlet/spring-boot/java/oauth2/resource-server/hello-security/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/servlet/spring-boot/java/oauth2/resource-server/hello-security/gradle.properties b/servlet/spring-boot/java/oauth2/resource-server/hello-security/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/oauth2/resource-server/hello-security/gradle.properties +++ b/servlet/spring-boot/java/oauth2/resource-server/hello-security/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/oauth2/resource-server/jwe/build.gradle b/servlet/spring-boot/java/oauth2/resource-server/jwe/build.gradle index 40f80e1..4276e9f 100644 --- a/servlet/spring-boot/java/oauth2/resource-server/jwe/build.gradle +++ b/servlet/spring-boot/java/oauth2/resource-server/jwe/build.gradle @@ -15,8 +15,8 @@ */ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/servlet/spring-boot/java/oauth2/resource-server/jwe/gradle.properties b/servlet/spring-boot/java/oauth2/resource-server/jwe/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/oauth2/resource-server/jwe/gradle.properties +++ b/servlet/spring-boot/java/oauth2/resource-server/jwe/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/build.gradle b/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/build.gradle index f34a102..a65f5fc 100644 --- a/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/build.gradle +++ b/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/build.gradle @@ -15,8 +15,8 @@ */ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '2.6.4' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } @@ -31,7 +31,7 @@ dependencies { implementation 'com.squareup.okhttp3:mockwebserver' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'com.nimbusds:oauth2-oidc-sdk' + implementation 'com.nimbusds:oauth2-oidc-sdk:9.29' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' diff --git a/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/gradle.properties b/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/gradle.properties index c924e36..e19a862 100644 --- a/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/gradle.properties +++ b/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=5.7.0-SNAPSHOT +spring-security.version=5.7.0-SNAPSHOT diff --git a/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/src/main/resources/application.yml b/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/src/main/resources/application.yml index fe03b67..3c4745b 100644 --- a/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/src/main/resources/application.yml +++ b/servlet/spring-boot/java/oauth2/resource-server/multi-tenancy/src/main/resources/application.yml @@ -7,4 +7,7 @@ spring: opaquetoken: introspection-uri: ${mockwebserver.url}/introspect client-id: client - client-secret: secret \ No newline at end of file + client-secret: secret + mvc: + pathmatch: + matching-strategy: ant_path_matcher diff --git a/servlet/spring-boot/java/oauth2/resource-server/opaque/build.gradle b/servlet/spring-boot/java/oauth2/resource-server/opaque/build.gradle index f34a102..c58f5df 100644 --- a/servlet/spring-boot/java/oauth2/resource-server/opaque/build.gradle +++ b/servlet/spring-boot/java/oauth2/resource-server/opaque/build.gradle @@ -15,8 +15,8 @@ */ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } @@ -31,7 +31,7 @@ dependencies { implementation 'com.squareup.okhttp3:mockwebserver' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'com.nimbusds:oauth2-oidc-sdk' + implementation 'com.nimbusds:oauth2-oidc-sdk:9.29' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' diff --git a/servlet/spring-boot/java/oauth2/resource-server/opaque/gradle.properties b/servlet/spring-boot/java/oauth2/resource-server/opaque/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/oauth2/resource-server/opaque/gradle.properties +++ b/servlet/spring-boot/java/oauth2/resource-server/opaque/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/oauth2/resource-server/static/build.gradle b/servlet/spring-boot/java/oauth2/resource-server/static/build.gradle index 40f80e1..4276e9f 100644 --- a/servlet/spring-boot/java/oauth2/resource-server/static/build.gradle +++ b/servlet/spring-boot/java/oauth2/resource-server/static/build.gradle @@ -15,8 +15,8 @@ */ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } diff --git a/servlet/spring-boot/java/oauth2/resource-server/static/gradle.properties b/servlet/spring-boot/java/oauth2/resource-server/static/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/oauth2/resource-server/static/gradle.properties +++ b/servlet/spring-boot/java/oauth2/resource-server/static/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/oauth2/webclient/build.gradle b/servlet/spring-boot/java/oauth2/webclient/build.gradle index 6e282ac..259b84e 100644 --- a/servlet/spring-boot/java/oauth2/webclient/build.gradle +++ b/servlet/spring-boot/java/oauth2/webclient/build.gradle @@ -15,8 +15,8 @@ */ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } @@ -32,7 +32,7 @@ dependencies { implementation 'org.springframework:spring-webflux' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' implementation 'io.projectreactor.netty:reactor-netty' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/servlet/spring-boot/java/oauth2/webclient/gradle.properties b/servlet/spring-boot/java/oauth2/webclient/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/oauth2/webclient/gradle.properties +++ b/servlet/spring-boot/java/oauth2/webclient/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/saml2/login-single-tenant/build.gradle b/servlet/spring-boot/java/saml2/login-single-tenant/build.gradle index 4120308..e5879af 100644 --- a/servlet/spring-boot/java/saml2/login-single-tenant/build.gradle +++ b/servlet/spring-boot/java/saml2/login-single-tenant/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } @@ -22,7 +22,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.security:spring-security-saml2-service-provider' - implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' testImplementation 'net.sourceforge.htmlunit:htmlunit' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/servlet/spring-boot/java/saml2/login-single-tenant/gradle.properties b/servlet/spring-boot/java/saml2/login-single-tenant/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/saml2/login-single-tenant/gradle.properties +++ b/servlet/spring-boot/java/saml2/login-single-tenant/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/saml2/login/build.gradle b/servlet/spring-boot/java/saml2/login/build.gradle index 4120308..ca79630 100644 --- a/servlet/spring-boot/java/saml2/login/build.gradle +++ b/servlet/spring-boot/java/saml2/login/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.2' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } @@ -22,11 +22,12 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.security:spring-security-saml2-service-provider' - implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' testImplementation 'net.sourceforge.htmlunit:htmlunit' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' + testImplementation 'org.awaitility:awaitility:4.2.0' } tasks.withType(Test).configureEach { diff --git a/servlet/spring-boot/java/saml2/login/gradle.properties b/servlet/spring-boot/java/saml2/login/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/saml2/login/gradle.properties +++ b/servlet/spring-boot/java/saml2/login/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/java/saml2/login/src/integTest/java/example/Saml2LoginApplicationITests.java b/servlet/spring-boot/java/saml2/login/src/integTest/java/example/Saml2LoginApplicationITests.java index 2ddcfaf..5c40b9d 100644 --- a/servlet/spring-boot/java/saml2/login/src/integTest/java/example/Saml2LoginApplicationITests.java +++ b/servlet/spring-boot/java/saml2/login/src/integTest/java/example/Saml2LoginApplicationITests.java @@ -16,50 +16,33 @@ package example; -import java.io.IOException; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpSession; +import java.util.concurrent.TimeUnit; +import com.gargoylesoftware.htmlunit.ElementNotFoundException; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlInput; import com.gargoylesoftware.htmlunit.html.HtmlPage; +import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput; import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.mock.web.MockHttpSession; import org.springframework.test.web.servlet.MockMvc; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.awaitility.Awaitility.await; @SpringBootTest @AutoConfigureMockMvc public class Saml2LoginApplicationITests { - static final String SIGNED_RESPONSE = "PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIElEPSJfY2UyYjU4NTVjZjU5YmEyNDc4OTUyOGRkOGQzZDcyOGRiMGViZjNlNzNiIiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAyMS0wMS0yMFQwMTowMzoyNFoiIERlc3RpbmF0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvbG9naW4vc2FtbDIvc3NvL29uZSIgSW5SZXNwb25zZVRvPSJBUlFjOThmMjAwLWRjZjctNGRmNC1hNTIyLTA3MjA2MjA4YjA3ZCI+PHNhbWw6SXNzdWVyPmh0dHBzOi8vc2ltcGxlc2FtbC1mb3Itc3ByaW5nLXNhbWwuYXBwcy5wY2ZvbmUuaW8vc2FtbDIvaWRwL21ldGFkYXRhLnBocDwvc2FtbDpJc3N1ZXI+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CiAgPGRzOlNpZ25lZEluZm8+PGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4KICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8+CiAgPGRzOlJlZmVyZW5jZSBVUkk9IiNfY2UyYjU4NTVjZjU5YmEyNDc4OTUyOGRkOGQzZDcyOGRiMGViZjNlNzNiIj48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+PC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU+TXJUNS8wdTRScTl3QmMvejFQd2FrNURXZm1xOGlOVk52NldHZWFnZUVzUT08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU+WWg1UFE5cFVBbkkvOW5tNzgxZ040bThTS0U4T1VRTDVOMlI3ZklPZmtHVmMzRjhzNlJlR3hRNWFneUFXYnQzUDRwQ3RWeGtqbk4rMk5KeUw4QmhRMHN0dEovb2JFTHJGUldLemYyYUJaS2NCN0JHTFNtRXdoUFE3N3BHL0psMjBhaDQyaGRyWFc3TE9Ob0VZOHMyY093dm16NkQ2bW9YQWprMHV2UEVTNjhUVndxU2VmT3JwNXV0QmRSQUt6cUJRQ2NQWFJCdnB5NWJ3QkpDL2RKNE5QLzJpalE3N2I3eWhvVDQ0R21hSUduSGo0YVFaeG9kY1JuNU9oQ2hYRk4ydUk2YW1mT0ZYOThjUXZ5KzhDWm9YYUZRMnJmT2dPbGdzbmNGWGMwaXhYK05MSjlvSlJWT2hxRVpjY2JoZ3hPM2hpQ2UwemRuZHloVWxpaGMwdFU2OVlBPT08L2RzOlNpZ25hdHVyZVZhbHVlPgo8ZHM6S2V5SW5mbz48ZHM6WDUwOURhdGE+PGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFRXpDQ0F2dWdBd0lCQWdJSkFJYzFxekxydis1bk1BMEdDU3FHU0liM0RRRUJDd1VBTUlHZk1Rc3dDUVlEVlFRR0V3SlZVekVMTUFrR0ExVUVDQXdDUTA4eEZEQVNCZ05WQkFjTUMwTmhjM1JzWlNCU2IyTnJNUnd3R2dZRFZRUUtEQk5UWVcxc0lGUmxjM1JwYm1jZ1UyVnlkbVZ5TVFzd0NRWURWUVFMREFKSlZERWdNQjRHQTFVRUF3d1hjMmx0Y0d4bGMyRnRiSEJvY0M1alptRndjSE11YVc4eElEQWVCZ2txaGtpRzl3MEJDUUVXRVdab1lXNXBhMEJ3YVhadmRHRnNMbWx2TUI0WERURTFNREl5TXpJeU5EVXdNMW9YRFRJMU1ESXlNakl5TkRVd00xb3dnWjh4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSURBSkRUekVVTUJJR0ExVUVCd3dMUTJGemRHeGxJRkp2WTJzeEhEQWFCZ05WQkFvTUUxTmhiV3dnVkdWemRHbHVaeUJUWlhKMlpYSXhDekFKQmdOVkJBc01Ba2xVTVNBd0hnWURWUVFEREJkemFXMXdiR1Z6WVcxc2NHaHdMbU5tWVhCd2N5NXBiekVnTUI0R0NTcUdTSWIzRFFFSkFSWVJabWhoYm1sclFIQnBkbTkwWVd3dWFXOHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDNGNuNjJFMXhMcXBOMzRQbWJyS0Jia09YRmp6V2dKOWIrcFh1YVJmdDZBMzM5dXVJUWVvZUg1cWVTS1JWVGwzMkwwZ2R6Mlppdkx3WlhXK2NxdmZ0VlcxdHZFSHZ6SkZ5eGVUVzNmQ1VlQ1FzZWJMbkEycVJhMDdSa3hUbzZOZjI0NG1XV1JEb2Rjb0hFZkRVU2J4ZlRaNklFeFNvalNJVTJSbkQ2V2xsWVdGZEQxR0ZwQkpPbVFCOHJBYzh3SklCZEhGZFFuWDhUdGw3aFo2cnRncUVZTXpZVk11SjJGMnIxSFNVMXpTQXZ3cGRZUDZyUkdGUkpFZmRBOW1tM1dLZk5MU2M1Y2xqejBYL1RYeTB2VmxBVjk1bDlxY2ZGelBtcmtOSXN0OUZaU3dwdkI0OUx5QVZrZTA0RlFQUHdMZ1ZINGdwaGlKSDNqdlo3SStKNWxTOFZBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlRUeVA2Q2M1SGxCSjUrdWNWQ3dHYzVvZ0tOR3pBZkJnTlZIU01FR0RBV2dCVFR5UDZDYzVIbEJKNSt1Y1ZDd0djNW9nS05HekFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQXZNUzRFUWVQL2lwVjRqT0c1bE82L3RZQ2IvaUplQWR1T25SaGtKazBEYlgzMjlsRExaaFRUTC94L3cvOW11Q1ZjdkxyekVwNlBOK1ZXZnc1RTVGV3RaTjB5aEd0UDlSK3ZabnJWK29jMnpHRCtubzEveVNGT2UzRWlKQ081ZGVoeEtqWUVtQlJ2NXNVL0xaRktacG96S04vQk1FYTZDcUx1eGJ6Yjd5a3hWcjdFVkZYd2x0UHh6RTlUbUw5T0FDTk55RjVlSkhXTVJNbGxhclV2a2NYbGg0cHV4NGtzOWU2elY5RFFCeTJ6ZHM5ZjFJM3F4ZzBlWDZKbkdyWGkvWmlDVCtsSmdWZTNaRlhpZWppTEFpS0IwNHNYVzN0aTBMVzNseDEzWTFZbFE0L3RscGdUZ2ZJSnhLVjZueVBpTG9LMG55d2JNZCt2cEFpckR0Mk9jK2hrPC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9kczpTaWduYXR1cmU+PHNhbWxwOlN0YXR1cz48c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+PC9zYW1scDpTdGF0dXM+PHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9Il9jYjYzYmMzNmMyYzAzYjRlMWJjZDViMWIwY2MyZTE2NWQwNDQ1NDZlODgiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDIxLTAxLTIwVDAxOjAzOjI0WiI+PHNhbWw6SXNzdWVyPmh0dHBzOi8vc2ltcGxlc2FtbC1mb3Itc3ByaW5nLXNhbWwuYXBwcy5wY2ZvbmUuaW8vc2FtbDIvaWRwL21ldGFkYXRhLnBocDwvc2FtbDpJc3N1ZXI+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CiAgPGRzOlNpZ25lZEluZm8+PGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4KICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8+CiAgPGRzOlJlZmVyZW5jZSBVUkk9IiNfY2I2M2JjMzZjMmMwM2I0ZTFiY2Q1YjFiMGNjMmUxNjVkMDQ0NTQ2ZTg4Ij48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+PC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU+VWFtN2NHVGlCd2xuRDBJdGd5aU5KVjN2Z0NPNytZZkRxSWJrWERkR3hrQT08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU+RkhpWUpETDlKTXM1Y2V5WXhUVVgrUndEQm45RFYzVE81dDFham4raGFtb1c2MUpBY0JaNjEwUHpYMzN3alA3Mk1kYmdDWnR5ZmNrSktZUUpPT0szRkxLTkJLQkphOTNsSS9rZWZjTXRTUGxBU2hESm9ydmU0U0tWa29WbzZLVnB0eC9OTnowRkhJNURFZTZiUUVjZWFiNERVNDFVdEpQMHUyWm16ejVjNC83VzhLdmt6MkxMbXhWZlE3Q2todmgvNzBhWHlkWVBVRml3bE4vV1lTV3JYVU9oOXNFTDFiZGVlQzFkYnpaeVdNNldnSkdRMUpJblBnSGd0YTlxMU96eGliOFlLRXpQSUMzVEZldkU1Y0phMFQvd1NzOVIxN0JSR09OclhTTWQvRCt4YkY0Z3lIYW5EZFlOYVN2TzdIS2p4bzRwYk1aY05peDhMTkVYZGtiZEx3PT08L2RzOlNpZ25hdHVyZVZhbHVlPgo8ZHM6S2V5SW5mbz48ZHM6WDUwOURhdGE+PGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFRXpDQ0F2dWdBd0lCQWdJSkFJYzFxekxydis1bk1BMEdDU3FHU0liM0RRRUJDd1VBTUlHZk1Rc3dDUVlEVlFRR0V3SlZVekVMTUFrR0ExVUVDQXdDUTA4eEZEQVNCZ05WQkFjTUMwTmhjM1JzWlNCU2IyTnJNUnd3R2dZRFZRUUtEQk5UWVcxc0lGUmxjM1JwYm1jZ1UyVnlkbVZ5TVFzd0NRWURWUVFMREFKSlZERWdNQjRHQTFVRUF3d1hjMmx0Y0d4bGMyRnRiSEJvY0M1alptRndjSE11YVc4eElEQWVCZ2txaGtpRzl3MEJDUUVXRVdab1lXNXBhMEJ3YVhadmRHRnNMbWx2TUI0WERURTFNREl5TXpJeU5EVXdNMW9YRFRJMU1ESXlNakl5TkRVd00xb3dnWjh4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSURBSkRUekVVTUJJR0ExVUVCd3dMUTJGemRHeGxJRkp2WTJzeEhEQWFCZ05WQkFvTUUxTmhiV3dnVkdWemRHbHVaeUJUWlhKMlpYSXhDekFKQmdOVkJBc01Ba2xVTVNBd0hnWURWUVFEREJkemFXMXdiR1Z6WVcxc2NHaHdMbU5tWVhCd2N5NXBiekVnTUI0R0NTcUdTSWIzRFFFSkFSWVJabWhoYm1sclFIQnBkbTkwWVd3dWFXOHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDNGNuNjJFMXhMcXBOMzRQbWJyS0Jia09YRmp6V2dKOWIrcFh1YVJmdDZBMzM5dXVJUWVvZUg1cWVTS1JWVGwzMkwwZ2R6Mlppdkx3WlhXK2NxdmZ0VlcxdHZFSHZ6SkZ5eGVUVzNmQ1VlQ1FzZWJMbkEycVJhMDdSa3hUbzZOZjI0NG1XV1JEb2Rjb0hFZkRVU2J4ZlRaNklFeFNvalNJVTJSbkQ2V2xsWVdGZEQxR0ZwQkpPbVFCOHJBYzh3SklCZEhGZFFuWDhUdGw3aFo2cnRncUVZTXpZVk11SjJGMnIxSFNVMXpTQXZ3cGRZUDZyUkdGUkpFZmRBOW1tM1dLZk5MU2M1Y2xqejBYL1RYeTB2VmxBVjk1bDlxY2ZGelBtcmtOSXN0OUZaU3dwdkI0OUx5QVZrZTA0RlFQUHdMZ1ZINGdwaGlKSDNqdlo3SStKNWxTOFZBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlRUeVA2Q2M1SGxCSjUrdWNWQ3dHYzVvZ0tOR3pBZkJnTlZIU01FR0RBV2dCVFR5UDZDYzVIbEJKNSt1Y1ZDd0djNW9nS05HekFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQXZNUzRFUWVQL2lwVjRqT0c1bE82L3RZQ2IvaUplQWR1T25SaGtKazBEYlgzMjlsRExaaFRUTC94L3cvOW11Q1ZjdkxyekVwNlBOK1ZXZnc1RTVGV3RaTjB5aEd0UDlSK3ZabnJWK29jMnpHRCtubzEveVNGT2UzRWlKQ081ZGVoeEtqWUVtQlJ2NXNVL0xaRktacG96S04vQk1FYTZDcUx1eGJ6Yjd5a3hWcjdFVkZYd2x0UHh6RTlUbUw5T0FDTk55RjVlSkhXTVJNbGxhclV2a2NYbGg0cHV4NGtzOWU2elY5RFFCeTJ6ZHM5ZjFJM3F4ZzBlWDZKbkdyWGkvWmlDVCtsSmdWZTNaRlhpZWppTEFpS0IwNHNYVzN0aTBMVzNseDEzWTFZbFE0L3RscGdUZ2ZJSnhLVjZueVBpTG9LMG55d2JNZCt2cEFpckR0Mk9jK2hrPC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9kczpTaWduYXR1cmU+PHNhbWw6U3ViamVjdD48c2FtbDpOYW1lSUQgU1BOYW1lUXVhbGlmaWVyPSJodHRwOi8vbG9jYWxob3N0OjgwODAvc2FtbDIvc2VydmljZS1wcm92aWRlci1tZXRhZGF0YS9vbmUiIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6ZW1haWxBZGRyZXNzIj50ZXN0dXNlckBzcHJpbmcuc2VjdXJpdHkuc2FtbDwvc2FtbDpOYW1lSUQ+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjA1Mi0wOS0yOFQwMjo1MDowNFoiIFJlY2lwaWVudD0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2xvZ2luL3NhbWwyL3Nzby9vbmUiIEluUmVzcG9uc2VUbz0iQVJRYzk4ZjIwMC1kY2Y3LTRkZjQtYTUyMi0wNzIwNjIwOGIwN2QiLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWw6U3ViamVjdD48c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAyMS0wMS0yMFQwMTowMjo1NFoiIE5vdE9uT3JBZnRlcj0iMjA1Mi0wOS0yOFQwMjo1MDowNFoiPjxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+PHNhbWw6QXVkaWVuY2U+aHR0cDovL2xvY2FsaG9zdDo4MDgwL3NhbWwyL3NlcnZpY2UtcHJvdmlkZXItbWV0YWRhdGEvb25lPC9zYW1sOkF1ZGllbmNlPjwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjwvc2FtbDpDb25kaXRpb25zPjxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAyMS0wMS0yMFQwMDo0ODoyOVoiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMjEtMDEtMjBUMDg6NDg6MjlaIiBTZXNzaW9uSW5kZXg9Il9lN2ExYTllNDk1YmZlMjI2NjQ5ZThkY2MzN2UxNDE1NDQ5NTIxNWQ2ZWIiPjxzYW1sOkF1dGhuQ29udGV4dD48c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZFByb3RlY3RlZFRyYW5zcG9ydDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj48L3NhbWw6QXV0aG5Db250ZXh0Pjwvc2FtbDpBdXRoblN0YXRlbWVudD48c2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+PHNhbWw6QXR0cmlidXRlIE5hbWU9InVpZCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dGVzdHVzZXJAc3ByaW5nLnNlY3VyaXR5LnNhbWw8L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0iZWR1UGVyc29uQWZmaWxpYXRpb24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPm1lbWJlcjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj51c2VyPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPjwvc2FtbDpBdHRyaWJ1dGU+PHNhbWw6QXR0cmlidXRlIE5hbWU9ImVtYWlsQWRkcmVzcyIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dGVzdHVzZXJAc3ByaW5nLnNlY3VyaXR5LnNhbWw8L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48L3NhbWw6QXR0cmlidXRlU3RhdGVtZW50Pjwvc2FtbDpBc3NlcnRpb24+PC9zYW1scDpSZXNwb25zZT4="; - - static final Map> USER_ATTRIBUTES = new LinkedHashMap<>(); - - static { - USER_ATTRIBUTES.put("uid", Arrays.asList("testuser@spring.security.saml")); - USER_ATTRIBUTES.put("eduPersonAffiliation", Arrays.asList("member", "user")); - USER_ATTRIBUTES.put("emailAddress", Arrays.asList("testuser@spring.security.saml")); - } - @Autowired MockMvc mvc; @@ -71,51 +54,80 @@ public class Saml2LoginApplicationITests { this.webClient.getCookieManager().clearCookies(); } - @Test - void indexWhenSamlResponseThenShowsUserInformation() throws Exception { - HttpSession session = this.mvc.perform(get("http://localhost:8080/")).andExpect(status().is3xxRedirection()) - .andExpect(redirectedUrl("http://localhost:8080/login")).andReturn().getRequest().getSession(); - - this.mvc.perform(post("http://localhost:8080/login/saml2/sso/one").param("SAMLResponse", SIGNED_RESPONSE) - .session((MockHttpSession) session)).andExpect(redirectedUrl("http://localhost:8080/")); - - this.mvc.perform(get("http://localhost:8080/").session((MockHttpSession) session)) - .andExpect(model().attribute("emailAddress", "testuser@spring.security.saml")) - .andExpect(model().attribute("userAttributes", USER_ATTRIBUTES)); - } - - @Test - void authenticationAttemptWhenValidThenShowsUserEmailAddress() throws Exception { - HtmlPage relyingParty = performLogin(); - assertThat(relyingParty.asNormalizedText()).contains("You're email address is testuser@spring.security.saml"); - } - - @Test - void logoutWhenRelyingPartyInitiatedLogoutThenLoginPageWithLogoutParam() throws Exception { - HtmlPage relyingParty = performLogin(); - HtmlElement rpLogoutButton = relyingParty.getHtmlElementById("rp_logout_button"); - HtmlPage loginPage = rpLogoutButton.click(); - assertThat(loginPage.getUrl().getFile()).isEqualTo("/login?logout"); - } - - @Test - void logoutWhenAssertingPartyInitiatedLogoutThenLoginPageWithLogoutParam() throws Exception { - HtmlPage relyingParty = performLogin(); - HtmlElement apLogoutButton = relyingParty.getHtmlElementById("ap_logout_button"); - HtmlPage loginPage = apLogoutButton.click(); - assertThat(loginPage.getUrl().getFile()).isEqualTo("/login?logout"); - } - - private HtmlPage performLogin() throws IOException { + private void performLogin(String registrationId) throws Exception { HtmlPage login = this.webClient.getPage("/"); - HtmlPage assertingParty = login.getAnchorByHref("/saml2/authenticate/one").click(); - HtmlForm form = assertingParty.getFormByName("f"); + login.getAnchorByHref("/saml2/authenticate/" + registrationId).click(); + this.webClient.waitForBackgroundJavaScript(10000); + HtmlPage okta = (HtmlPage) this.webClient.getCurrentWindow().getEnclosedPage(); + this.webClient.waitForBackgroundJavaScript(10000); + HtmlForm form = findForm(okta); HtmlInput username = form.getInputByName("username"); - HtmlInput password = form.getInputByName("password"); - HtmlSubmitInput submit = assertingParty.getHtmlElementById("submit_button"); - username.setValueAttribute("user"); - password.setValueAttribute("password"); - return submit.click(); + HtmlPasswordInput password = form.getInputByName("password"); + HtmlSubmitInput submit = okta.getHtmlElementById("okta-signin-submit"); + username.type("testuser@spring.security.saml"); + password.type("12345678"); + submit.click(); + this.webClient.waitForBackgroundJavaScript(10000); + } + + private HtmlForm findForm(HtmlPage login) { + await().atMost(10, TimeUnit.SECONDS) + .until(() -> login.getForms().stream().map(HtmlForm::getId).anyMatch("form19"::equals)); + for (HtmlForm form : login.getForms()) { + try { + if (form.getId().equals("form19")) { + return form; + } + } + catch (ElementNotFoundException ex) { + // Continue + } + } + throw new IllegalStateException("Could not resolve login form"); + } + + @DisplayName("Tenant one tests") + @Nested + class TenantOneTests { + + @Test + void authenticationAttemptWhenValidThenShowsUserEmailAddress() throws Exception { + performLogin("one"); + HtmlPage home = (HtmlPage) Saml2LoginApplicationITests.this.webClient.getCurrentWindow().getEnclosedPage(); + assertThat(home.asText()).contains("You're email address is testuser@spring.security.saml"); + } + + @Test + void logoutWhenRelyingPartyInitiatedLogoutThenLoginPageWithLogoutParam() throws Exception { + performLogin("one"); + HtmlPage home = (HtmlPage) Saml2LoginApplicationITests.this.webClient.getCurrentWindow().getEnclosedPage(); + HtmlElement rpLogoutButton = home.getHtmlElementById("rp_logout_button"); + HtmlPage loginPage = rpLogoutButton.click(); + assertThat(loginPage.getUrl().getFile()).isEqualTo("/login?logout"); + } + + } + + @DisplayName("Tenant two tests") + @Nested + class TenantTwoTests { + + @Test + void authenticationAttemptWhenValidThenShowsUserEmailAddress() throws Exception { + performLogin("two"); + HtmlPage home = (HtmlPage) Saml2LoginApplicationITests.this.webClient.getCurrentWindow().getEnclosedPage(); + assertThat(home.asText()).contains("You're email address is testuser@spring.security.saml"); + } + + @Test + void logoutWhenRelyingPartyInitiatedLogoutThenLoginPageWithLogoutParam() throws Exception { + performLogin("two"); + HtmlPage home = (HtmlPage) Saml2LoginApplicationITests.this.webClient.getCurrentWindow().getEnclosedPage(); + HtmlElement rpLogoutButton = home.getHtmlElementById("rp_logout_button"); + HtmlPage loginPage = rpLogoutButton.click(); + assertThat(loginPage.getUrl().getFile()).isEqualTo("/login?logout"); + } + } } diff --git a/servlet/spring-boot/java/saml2/refreshable-metadata/build.gradle b/servlet/spring-boot/java/saml2/refreshable-metadata/build.gradle index 3fc5803..e5879af 100644 --- a/servlet/spring-boot/java/saml2/refreshable-metadata/build.gradle +++ b/servlet/spring-boot/java/saml2/refreshable-metadata/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.5.6' - id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'org.springframework.boot' version '3.0.0-M1' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "nebula.integtest" version "8.2.0" id 'java' } @@ -22,7 +22,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.security:spring-security-saml2-service-provider' - implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' testImplementation 'net.sourceforge.htmlunit:htmlunit' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/servlet/spring-boot/java/saml2/refreshable-metadata/gradle.properties b/servlet/spring-boot/java/saml2/refreshable-metadata/gradle.properties index c924e36..ce1417e 100644 --- a/servlet/spring-boot/java/saml2/refreshable-metadata/gradle.properties +++ b/servlet/spring-boot/java/saml2/refreshable-metadata/gradle.properties @@ -1,2 +1,2 @@ -version=5.6.0-SNAPSHOT -spring-security.version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/kotlin/hello-security/build.gradle.kts b/servlet/spring-boot/kotlin/hello-security/build.gradle.kts index 968fc25..69420e0 100644 --- a/servlet/spring-boot/kotlin/hello-security/build.gradle.kts +++ b/servlet/spring-boot/kotlin/hello-security/build.gradle.kts @@ -1,8 +1,8 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - id("org.springframework.boot") version "2.5.0" - id("io.spring.dependency-management") version "1.0.9.RELEASE" + id("org.springframework.boot") version "3.0.0-M1" + id("io.spring.dependency-management") version "1.0.11.RELEASE" kotlin("jvm") version "1.6.0" kotlin("plugin.spring") version "1.6.0" } @@ -12,15 +12,16 @@ repositories { maven { url = uri("https://repo.spring.io/snapshot") } + maven { + url = uri("https://repo.spring.io/milestone") + } } dependencies { - implementation("org.jetbrains.kotlin:kotlin-reflect") - implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-thymeleaf") implementation("org.springframework.boot:spring-boot-starter-web") - implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity5") + implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity6") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.security:spring-security-test") } diff --git a/servlet/spring-boot/kotlin/hello-security/gradle.properties b/servlet/spring-boot/kotlin/hello-security/gradle.properties index 778a95c..a37772a 100644 --- a/servlet/spring-boot/kotlin/hello-security/gradle.properties +++ b/servlet/spring-boot/kotlin/hello-security/gradle.properties @@ -1 +1 @@ -spring-security.version=5.6.0-SNAPSHOT +spring-security.version=6.0.0-SNAPSHOT diff --git a/servlet/spring-boot/kotlin/hello-security/src/main/kotlin/org/springframework/security/samples/config/SecurityConfig.kt b/servlet/spring-boot/kotlin/hello-security/src/main/kotlin/org/springframework/security/samples/config/SecurityConfig.kt index 296d19b..063555d 100644 --- a/servlet/spring-boot/kotlin/hello-security/src/main/kotlin/org/springframework/security/samples/config/SecurityConfig.kt +++ b/servlet/spring-boot/kotlin/hello-security/src/main/kotlin/org/springframework/security/samples/config/SecurityConfig.kt @@ -19,7 +19,6 @@ package org.springframework.security.samples.config import org.springframework.context.annotation.Bean import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity -import org.springframework.security.config.web.servlet.invoke import org.springframework.security.core.userdetails.User import org.springframework.security.core.userdetails.UserDetailsService import org.springframework.security.provisioning.InMemoryUserDetailsManager @@ -33,15 +32,11 @@ class SecurityConfig { @Bean fun filterChain(http: HttpSecurity): SecurityFilterChain { - http { - authorizeRequests { - authorize("/css/**", permitAll) - authorize("/user/**", hasAuthority("ROLE_USER")) - } - formLogin { - loginPage = "/log-in" - } - } + http.authorizeRequests() + .antMatchers("/css/**").permitAll() + .antMatchers("/user/**").hasAuthority("ROLE_USER") + .and() + .formLogin().loginPage("/log-in") return http.build() } diff --git a/servlet/xml/java/contacts/gradle.properties b/servlet/xml/java/contacts/gradle.properties index 99e4019..a2f0b27 100644 --- a/servlet/xml/java/contacts/gradle.properties +++ b/servlet/xml/java/contacts/gradle.properties @@ -1 +1 @@ -version=5.6.0-SNAPSHOT \ No newline at end of file +version=6.0.0-SNAPSHOT diff --git a/servlet/xml/java/dms/gradle.properties b/servlet/xml/java/dms/gradle.properties index f309933..a2f0b27 100644 --- a/servlet/xml/java/dms/gradle.properties +++ b/servlet/xml/java/dms/gradle.properties @@ -1 +1 @@ -version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT diff --git a/servlet/xml/java/helloworld/gradle.properties b/servlet/xml/java/helloworld/gradle.properties index f309933..a2f0b27 100644 --- a/servlet/xml/java/helloworld/gradle.properties +++ b/servlet/xml/java/helloworld/gradle.properties @@ -1 +1 @@ -version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT diff --git a/servlet/xml/java/preauth/gradle.properties b/servlet/xml/java/preauth/gradle.properties index f309933..a2f0b27 100644 --- a/servlet/xml/java/preauth/gradle.properties +++ b/servlet/xml/java/preauth/gradle.properties @@ -1 +1 @@ -version=5.6.0-SNAPSHOT +version=6.0.0-SNAPSHOT diff --git a/servlet/xml/java/saml2/login-logout/build.gradle b/servlet/xml/java/saml2/login-logout/build.gradle index 24eade3..96efcf7 100644 --- a/servlet/xml/java/saml2/login-logout/build.gradle +++ b/servlet/xml/java/saml2/login-logout/build.gradle @@ -1,6 +1,7 @@ plugins { id "java" - id "org.gretty" version "3.0.6" + id "nebula.integtest" version "8.2.0" + id "org.gretty" version "4.0.0" id "war" } @@ -34,7 +35,7 @@ dependencies { testImplementation "org.springframework:spring-test" testImplementation "org.springframework.security:spring-security-test" testImplementation "org.junit.jupiter:junit-jupiter-api" - testImplementation 'net.sourceforge.htmlunit:htmlunit:2.49.1' + testImplementation 'net.sourceforge.htmlunit:htmlunit:2.44.0' testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") diff --git a/servlet/xml/java/saml2/login-logout/gradle.properties b/servlet/xml/java/saml2/login-logout/gradle.properties index e170fd3..a2f0b27 100644 --- a/servlet/xml/java/saml2/login-logout/gradle.properties +++ b/servlet/xml/java/saml2/login-logout/gradle.properties @@ -1 +1 @@ -version=5.7.0-SNAPSHOT +version=6.0.0-SNAPSHOT diff --git a/servlet/xml/java/saml2/login-logout/gradle/gretty.gradle b/servlet/xml/java/saml2/login-logout/gradle/gretty.gradle index 6949bdf..3428615 100644 --- a/servlet/xml/java/saml2/login-logout/gradle/gretty.gradle +++ b/servlet/xml/java/saml2/login-logout/gradle/gretty.gradle @@ -1,5 +1,5 @@ gretty { - servletContainer = "tomcat9" + servletContainer = "tomcat10" contextPath = "/" fileLogEnabled = false integrationTestTask = 'integrationTest' @@ -38,4 +38,4 @@ project.tasks.matching { it.name == "integrationTest" }.all { integrationTest.systemProperty 'app.httpBaseURI', httpBaseUrl integrationTest.systemProperty 'app.httpsBaseURI', httpsBaseUrl } -} \ No newline at end of file +} diff --git a/settings.gradle b/settings.gradle index fcbbf0f..8a57a6c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,6 +2,7 @@ pluginManagement { repositories { mavenCentral() gradlePluginPortal() + maven { url 'https://repo.spring.io/milestone' } maven { url "https://repo.spring.io/libs-snapshot" } } resolutionStrategy {