Skip to content

Commit cfc5f3a

Browse files
authored
Merge branch 'main' into gh-16390
Signed-off-by: yoobin_mion <[email protected]>
2 parents 7c9df88 + 79cd982 commit cfc5f3a

File tree

618 files changed

+3787
-10279
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

618 files changed

+3787
-10279
lines changed

.github/workflows/check-snapshots.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: CI
2+
3+
on:
4+
schedule:
5+
- cron: '0 10 * * *' # Once per day at 10am UTC
6+
workflow_dispatch: # Manual trigger
7+
8+
env:
9+
DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
10+
11+
permissions:
12+
contents: read
13+
14+
jobs:
15+
snapshot-test:
16+
name: Test Against Snapshots
17+
uses: spring-io/spring-security-release-tools/.github/workflows/test.yml@v1
18+
strategy:
19+
matrix:
20+
include:
21+
- java-version: 21-ea
22+
toolchain: 21
23+
- java-version: 17
24+
toolchain: 17
25+
with:
26+
java-version: ${{ matrix.java-version }}
27+
test-args: --refresh-dependencies -PforceMavenRepositories=snapshot,https://oss.sonatype.org/content/repositories/snapshots -PisOverrideVersionCatalog -PtestToolchain=${{ matrix.toolchain }} -PspringFrameworkVersion=7.+ -PreactorVersion=2025.+ -PspringDataVersion=2025.+ --stacktrace
28+
secrets: inherit
29+
send-notification:
30+
name: Send Notification
31+
needs: [ snapshot-test ]
32+
if: ${{ !success() }}
33+
runs-on: ubuntu-latest
34+
steps:
35+
- name: Send Notification
36+
uses: spring-io/spring-security-release-tools/.github/actions/send-notification@v1
37+
with:
38+
webhook-url: ${{ secrets.SPRING_SECURITY_CI_GCHAT_WEBHOOK_URL }}

.github/workflows/continuous-integration-workflow.yml

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,37 +27,24 @@ jobs:
2727
java-version: ${{ matrix.jdk }}
2828
distribution: temurin
2929
secrets: inherit
30-
test:
31-
name: Test Against Snapshots
32-
uses: spring-io/spring-security-release-tools/.github/workflows/test.yml@v1
33-
strategy:
34-
matrix:
35-
include:
36-
- java-version: 21-ea
37-
toolchain: 21
38-
- java-version: 17
39-
toolchain: 17
40-
with:
41-
java-version: ${{ matrix.java-version }}
42-
test-args: --refresh-dependencies -PforceMavenRepositories=snapshot,https://oss.sonatype.org/content/repositories/snapshots -PisOverrideVersionCatalog -PtestToolchain=${{ matrix.toolchain }} -PspringFrameworkVersion=7.+ -PreactorVersion=2025.+ -PspringDataVersion=2025.+ --stacktrace
43-
secrets: inherit
4430
deploy-artifacts:
4531
name: Deploy Artifacts
46-
needs: [ build, test]
32+
needs: [ build]
4733
uses: spring-io/spring-security-release-tools/.github/workflows/deploy-artifacts.yml@v1
4834
with:
4935
should-deploy-artifacts: ${{ needs.build.outputs.should-deploy-artifacts }}
36+
default-publish-milestones-central: true
5037
secrets: inherit
5138
deploy-docs:
5239
name: Deploy Docs
53-
needs: [ build, test ]
40+
needs: [ build ]
5441
uses: spring-io/spring-security-release-tools/.github/workflows/deploy-docs.yml@v1
5542
with:
5643
should-deploy-docs: ${{ needs.build.outputs.should-deploy-artifacts }}
5744
secrets: inherit
5845
deploy-schema:
5946
name: Deploy Schema
60-
needs: [ build, test ]
47+
needs: [ build ]
6148
uses: spring-io/spring-security-release-tools/.github/workflows/deploy-schema.yml@v1
6249
with:
6350
should-deploy-schema: ${{ needs.build.outputs.should-deploy-artifacts }}
@@ -69,7 +56,7 @@ jobs:
6956
with:
7057
should-perform-release: ${{ needs.deploy-artifacts.outputs.artifacts-deployed }}
7158
project-version: ${{ needs.deploy-artifacts.outputs.project-version }}
72-
milestone-repo-url: https://repo.spring.io/artifactory/milestone
59+
milestone-repo-url: https://repo1.maven.org/maven2
7360
release-repo-url: https://repo1.maven.org/maven2
7461
artifact-path: org/springframework/security/spring-security-core
7562
slack-announcing-id: spring-security-announcing

buildSrc/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ configurations {
6464
dependencies {
6565
implementation platform(libs.io.projectreactor.reactor.bom)
6666

67+
implementation libs.spring.nullability
6768
implementation libs.com.google.code.gson.gson
6869
implementation libs.com.thaiopensource.trag
6970
implementation libs.net.sourceforge.saxon.saxon
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
plugins {
2+
id 'io.spring.nullability'
3+
}

config/spring-security-config.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ dependencies {
3131
optional project(':spring-security-oauth2-resource-server')
3232
optional project(':spring-security-rsocket')
3333
optional project(':spring-security-web')
34+
optional project(':spring-security-webauthn')
3435
optional 'io.projectreactor:reactor-core'
3536
optional 'org.aspectj:aspectjweaver'
3637
optional 'org.springframework:spring-jdbc'
@@ -43,7 +44,6 @@ dependencies {
4344
optional 'org.jetbrains.kotlin:kotlin-reflect'
4445
optional 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
4546
optional 'jakarta.annotation:jakarta.annotation-api'
46-
optional libs.webauthn4j.core
4747

4848
provided 'jakarta.servlet:jakarta.servlet-api'
4949

@@ -57,6 +57,7 @@ dependencies {
5757
testImplementation project(':spring-security-saml2-service-provider')
5858
testImplementation project(path : ':spring-security-saml2-service-provider', configuration : 'tests')
5959
testImplementation project(path : ':spring-security-web', configuration : 'tests')
60+
testImplementation project(path : ':spring-security-webauthn', configuration : 'tests')
6061
testImplementation "jakarta.inject:jakarta.inject-api"
6162
testImplementation "org.assertj:assertj-core"
6263
testImplementation "org.junit.jupiter:junit-jupiter-api"

config/src/main/java/org/springframework/security/config/annotation/AbstractConfiguredSecurityBuilder.java

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
* @param <O> The object that this builder returns
5151
* @param <B> The type of this builder (that is returned by the base class)
5252
* @author Rob Winch
53+
* @author DingHao
5354
* @see WebSecurity
5455
*/
5556
public abstract class AbstractConfiguredSecurityBuilder<O, B extends SecurityBuilder<O>>
@@ -59,7 +60,7 @@ public abstract class AbstractConfiguredSecurityBuilder<O, B extends SecurityBui
5960

6061
private final LinkedHashMap<Class<? extends SecurityConfigurer<O, B>>, List<SecurityConfigurer<O, B>>> configurers = new LinkedHashMap<>();
6162

62-
private final List<SecurityConfigurer<O, B>> configurersAddedInInitializing = new ArrayList<>();
63+
private List<SecurityConfigurer<O, B>> configurersAddedInInitializing = new ArrayList<>();
6364

6465
private final Map<Class<?>, Object> sharedObjects = new HashMap<>();
6566

@@ -114,34 +115,38 @@ public O getOrBuild() {
114115
}
115116

116117
/**
117-
* Applies a {@link SecurityConfigurerAdapter} to this {@link SecurityBuilder} and
118-
* invokes {@link SecurityConfigurerAdapter#setBuilder(SecurityBuilder)}.
118+
* Applies a {@link SecurityConfigurer} to this {@link SecurityBuilder} overriding any
119+
* {@link SecurityConfigurer} of the exact same class. Note that object hierarchies
120+
* are not considered.
119121
* @param configurer
120122
* @return the {@link SecurityConfigurerAdapter} for further customizations
121123
* @throws Exception
122-
* @deprecated For removal in 7.0. Use
123-
* {@link #with(SecurityConfigurerAdapter, Customizer)} instead.
124124
*/
125-
@Deprecated(since = "6.2", forRemoval = true)
126-
@SuppressWarnings("unchecked")
127-
public <C extends SecurityConfigurerAdapter<O, B>> C apply(C configurer) throws Exception {
128-
configurer.addObjectPostProcessor(this.objectPostProcessor);
129-
configurer.setBuilder((B) this);
125+
public <C extends SecurityConfigurer<O, B>> C apply(C configurer) throws Exception {
130126
add(configurer);
131127
return configurer;
132128
}
133129

134130
/**
135-
* Applies a {@link SecurityConfigurer} to this {@link SecurityBuilder} overriding any
136-
* {@link SecurityConfigurer} of the exact same class. Note that object hierarchies
137-
* are not considered.
131+
* Applies a {@link SecurityConfigurerAdapter} to this {@link SecurityBuilder} and
132+
* invokes {@link SecurityConfigurerAdapter#setBuilder(SecurityBuilder)}.
133+
*
134+
* <p>
135+
* A shortcut for applying a configurer as-is, or in other words: <code>
136+
* .with(new MyConfigurer())
137+
* </code>
138+
*
139+
* <p>
140+
* Is identical to: <code>
141+
* .with(new MyConfigurer(), Customizer.withDefaults())
142+
* </code>
138143
* @param configurer
139-
* @return the {@link SecurityConfigurerAdapter} for further customizations
144+
* @return the {@link SecurityBuilder} for further customizations
140145
* @throws Exception
146+
* @since 7.0
141147
*/
142-
public <C extends SecurityConfigurer<O, B>> C apply(C configurer) throws Exception {
143-
add(configurer);
144-
return configurer;
148+
public <C extends SecurityConfigurerAdapter<O, B>> B with(C configurer) throws Exception {
149+
return with(configurer, Customizer.withDefaults());
145150
}
146151

147152
/**
@@ -365,8 +370,12 @@ private void init() throws Exception {
365370
for (SecurityConfigurer<O, B> configurer : configurers) {
366371
configurer.init((B) this);
367372
}
368-
for (SecurityConfigurer<O, B> configurer : this.configurersAddedInInitializing) {
369-
configurer.init((B) this);
373+
while (!this.configurersAddedInInitializing.isEmpty()) {
374+
List<SecurityConfigurer<O, B>> toInit = this.configurersAddedInInitializing;
375+
this.configurersAddedInInitializing = new ArrayList<>();
376+
for (SecurityConfigurer<O, B> configurer : toInit) {
377+
configurer.init((B) this);
378+
}
370379
}
371380
}
372381

config/src/main/java/org/springframework/security/config/annotation/SecurityConfigurerAdapter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.springframework.core.GenericTypeResolver;
2323
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
24+
import org.springframework.security.config.Customizer;
2425
import org.springframework.security.config.ObjectPostProcessor;
2526
import org.springframework.util.Assert;
2627

@@ -83,7 +84,7 @@ public void addObjectPostProcessor(ObjectPostProcessor<?> objectPostProcessor) {
8384

8485
/**
8586
* Sets the {@link SecurityBuilder} to be used. This is automatically set when using
86-
* {@link AbstractConfiguredSecurityBuilder#apply(SecurityConfigurerAdapter)}
87+
* {@link AbstractConfiguredSecurityBuilder#with(SecurityConfigurerAdapter, Customizer)}
8788
* @param builder the {@link SecurityBuilder} to set
8889
*/
8990
public void setBuilder(B builder) {

config/src/main/java/org/springframework/security/config/annotation/authentication/builders/AuthenticationManagerBuilder.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,9 @@ public <T extends UserDetailsService> DaoAuthenticationConfigurer<Authentication
195195
* @throws Exception if an error occurs when adding the LDAP authentication
196196
*/
197197
public LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> ldapAuthentication() throws Exception {
198-
return apply(new LdapAuthenticationProviderConfigurer<>());
198+
LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> ldap = new LdapAuthenticationProviderConfigurer<>();
199+
with(ldap);
200+
return ldap;
199201
}
200202

201203
/**
@@ -277,7 +279,8 @@ public UserDetailsService getDefaultUserDetailsService() {
277279
private <C extends UserDetailsAwareConfigurer<AuthenticationManagerBuilder, ? extends UserDetailsService>> C apply(
278280
C configurer) throws Exception {
279281
this.defaultUserDetailsService = configurer.getUserDetailsService();
280-
return super.apply(configurer);
282+
with(configurer);
283+
return configurer;
281284
}
282285

283286
}

config/src/main/java/org/springframework/security/config/annotation/authentication/configuration/EnableGlobalAuthentication.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -26,7 +26,6 @@
2626
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
2727
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
2828
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
29-
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
3029

3130
/**
3231
* The {@link EnableGlobalAuthentication} annotation signals that the annotated class can
@@ -87,14 +86,12 @@
8786
*
8887
* <ul>
8988
* <li>{@link EnableWebSecurity}</li>
90-
* <li>{@link EnableWebMvcSecurity}</li>
9189
* <li>{@link EnableGlobalMethodSecurity}</li>
9290
* </ul>
9391
*
9492
* Configuring {@link AuthenticationManagerBuilder} in a class without the
9593
* {@link EnableGlobalAuthentication} annotation has unpredictable results.
9694
*
97-
* @see EnableWebMvcSecurity
9895
* @see EnableWebSecurity
9996
* @see EnableGlobalMethodSecurity
10097
* @author Rob Winch

config/src/main/java/org/springframework/security/config/annotation/method/configuration/AuthorizationProxyDataConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ DataTargetVisitor dataTargetVisitor() {
4949
return new DataTargetVisitor();
5050
}
5151

52-
private static final class DataTargetVisitor implements AuthorizationAdvisorProxyFactory.TargetVisitor, Ordered {
52+
static final class DataTargetVisitor implements AuthorizationAdvisorProxyFactory.TargetVisitor, Ordered {
5353

5454
private static final int DEFAULT_ORDER = 200;
5555

0 commit comments

Comments
 (0)