Skip to content

Commit c2ba662

Browse files
committed
Enable Null checking in spring-security-web via JSpecify
Closes gh-17535
1 parent 49f308a commit c2ba662

File tree

261 files changed

+1782
-537
lines changed

Some content is hidden

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

261 files changed

+1782
-537
lines changed

config/src/test/kotlin/org/springframework/security/config/annotation/web/HttpSecurityDslTests.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ class HttpSecurityDslTests {
367367
this.spring.register(CustomFilterConfig::class.java).autowire()
368368

369369
val filterChain = spring.context.getBean(FilterChainProxy::class.java)
370-
val filters: List<Filter> = filterChain.getFilters("/")
370+
val filters: List<Filter>? = filterChain.getFilters("/")
371371

372372
assertThat(filters).anyMatch { it is CustomFilter }
373373
}
@@ -390,7 +390,7 @@ class HttpSecurityDslTests {
390390
this.spring.register(CustomFilterConfigReified::class.java).autowire()
391391

392392
val filterChain = spring.context.getBean(FilterChainProxy::class.java)
393-
val filters: List<Filter> = filterChain.getFilters("/")
393+
val filters: List<Filter>? = filterChain.getFilters("/")
394394

395395
assertThat(filters).anyMatch { it is CustomFilter }
396396
}
@@ -413,7 +413,7 @@ class HttpSecurityDslTests {
413413
this.spring.register(CustomFilterAfterConfig::class.java).autowire()
414414

415415
val filterChain = spring.context.getBean(FilterChainProxy::class.java)
416-
val filters: List<Class<out Filter>> = filterChain.getFilters("/").map { it.javaClass }
416+
val filters: List<Class<out Filter>> = filterChain.getFilters("/")!!.map { it.javaClass }
417417

418418
assertThat(filters).containsSubsequence(
419419
UsernamePasswordAuthenticationFilter::class.java,
@@ -440,7 +440,7 @@ class HttpSecurityDslTests {
440440
this.spring.register(CustomFilterAfterConfigReified::class.java).autowire()
441441

442442
val filterChain = spring.context.getBean(FilterChainProxy::class.java)
443-
val filterClasses: List<Class<out Filter>> = filterChain.getFilters("/").map { it.javaClass }
443+
val filterClasses: List<Class<out Filter>> = filterChain.getFilters("/")!!.map { it.javaClass }
444444

445445
assertThat(filterClasses).containsSubsequence(
446446
UsernamePasswordAuthenticationFilter::class.java,
@@ -467,7 +467,7 @@ class HttpSecurityDslTests {
467467
this.spring.register(CustomFilterBeforeConfig::class.java).autowire()
468468

469469
val filterChain = spring.context.getBean(FilterChainProxy::class.java)
470-
val filters: List<Class<out Filter>> = filterChain.getFilters("/").map { it.javaClass }
470+
val filters: List<Class<out Filter>> = filterChain.getFilters("/")!!.map { it.javaClass }
471471

472472
assertThat(filters).containsSubsequence(
473473
CustomFilter::class.java,
@@ -494,7 +494,7 @@ class HttpSecurityDslTests {
494494
this.spring.register(CustomFilterBeforeConfigReified::class.java).autowire()
495495

496496
val filterChain = spring.context.getBean(FilterChainProxy::class.java)
497-
val filterClasses: List<Class<out Filter>> = filterChain.getFilters("/").map { it.javaClass }
497+
val filterClasses: List<Class<out Filter>> = filterChain.getFilters("/")!!.map { it.javaClass }
498498

499499
assertThat(filterClasses).containsSubsequence(
500500
CustomFilter::class.java,
@@ -523,7 +523,7 @@ class HttpSecurityDslTests {
523523
this.spring.register(CustomSecurityConfigurerConfig::class.java).autowire()
524524

525525
val filterChain = spring.context.getBean(FilterChainProxy::class.java)
526-
val filterClasses: List<Class<out Filter>> = filterChain.getFilters("/").map { it.javaClass }
526+
val filterClasses: List<Class<out Filter>> = filterChain.getFilters("/")!!.map { it.javaClass }
527527

528528
assertThat(filterClasses).contains(
529529
CustomFilter::class.java
@@ -535,7 +535,7 @@ class HttpSecurityDslTests {
535535
this.spring.register(CustomSecurityConfigurerConfig::class.java).autowire()
536536

537537
val filterChain = spring.context.getBean(FilterChainProxy::class.java)
538-
val filterClasses: List<Class<out Filter>> = filterChain.getFilters("/").map { it.javaClass }
538+
val filterClasses: List<Class<out Filter>> = filterChain.getFilters("/")!!.map { it.javaClass }
539539

540540
assertThat(filterClasses).contains(
541541
CustomFilter::class.java
@@ -588,7 +588,7 @@ class HttpSecurityDslTests {
588588
this.spring.register(CustomDslUsingWithConfig::class.java).autowire()
589589

590590
val filterChain = spring.context.getBean(FilterChainProxy::class.java)
591-
val filterClasses: List<Class<out Filter>> = filterChain.getFilters("/").map { it.javaClass }
591+
val filterClasses: List<Class<out Filter>> = filterChain.getFilters("/")!!.map { it.javaClass }
592592

593593
assertThat(filterClasses).contains(
594594
UsernamePasswordAuthenticationFilter::class.java

config/src/test/kotlin/org/springframework/security/config/annotation/web/LogoutDslTests.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,8 @@ class LogoutDslTests {
350350

351351
class NoopLogoutHandler: LogoutHandler {
352352
override fun logout(
353-
request: HttpServletRequest?,
354-
response: HttpServletResponse?,
353+
request: HttpServletRequest,
354+
response: HttpServletResponse,
355355
authentication: Authentication?
356356
) { }
357357

config/src/test/kotlin/org/springframework/security/config/annotation/web/RequiresChannelDslTests.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ class RequiresChannelDslTests {
132132

133133
companion object {
134134
val CHANNEL_PROCESSOR: ChannelProcessor = object : ChannelProcessor {
135-
override fun decide(invocation: FilterInvocation?, config: MutableCollection<ConfigAttribute>?) {}
136-
override fun supports(attribute: ConfigAttribute?): Boolean = true
135+
override fun decide(invocation: FilterInvocation, config: MutableCollection<ConfigAttribute>) {}
136+
override fun supports(attribute: ConfigAttribute): Boolean = true
137137
}
138138
}
139139

config/src/test/kotlin/org/springframework/security/config/annotation/web/SecurityContextDslTests.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class SecurityContextDslTests {
9393
testContext.autowire()
9494
val filterChainProxy = testContext.context.getBean(FilterChainProxy::class.java)
9595
// @formatter:off
96-
val filterTypes = filterChainProxy.getFilters("/").toList()
96+
val filterTypes = filterChainProxy.getFilters("/")!!.toList()
9797

9898
assertThat(filterTypes)
9999
.anyMatch { it is SecurityContextHolderFilter }

config/src/test/kotlin/org/springframework/security/config/web/server/ServerHttpBasicDslTests.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,8 @@ class ServerHttpBasicDslTests {
270270

271271
open class MockServerAuthenticationFailureHandler: ServerAuthenticationFailureHandler {
272272
override fun onAuthenticationFailure(
273-
webFilterExchange: WebFilterExchange?,
274-
exception: AuthenticationException?
273+
webFilterExchange: WebFilterExchange,
274+
exception: AuthenticationException
275275
): Mono<Void> {
276276
return Mono.empty()
277277
}

core/src/main/java/org/springframework/security/access/ConfigAttribute.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import java.io.Serializable;
2020

21+
import org.jspecify.annotations.NullUnmarked;
22+
2123
import org.springframework.security.access.intercept.RunAsManager;
2224
import org.springframework.security.authorization.AuthorizationManager;
2325
import org.springframework.security.core.annotation.SecurityAnnotationScanner;
@@ -45,6 +47,7 @@
4547
* {@link AuthorizationManager}.
4648
*/
4749
@Deprecated
50+
@NullUnmarked
4851
public interface ConfigAttribute extends Serializable {
4952

5053
/**

core/src/main/java/org/springframework/security/access/expression/SecurityExpressionRoot.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ public void setTrustResolver(AuthenticationTrustResolver trustResolver) {
177177
this.trustResolver = trustResolver;
178178
}
179179

180-
public void setRoleHierarchy(RoleHierarchy roleHierarchy) {
180+
public void setRoleHierarchy(@Nullable RoleHierarchy roleHierarchy) {
181181
this.roleHierarchy = roleHierarchy;
182182
}
183183

core/src/main/java/org/springframework/security/access/expression/method/DefaultMethodSecurityExpressionHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ public StandardEvaluationContext createEvaluationContextInternal(@Nullable Authe
8585
}
8686

8787
@Override
88+
@SuppressWarnings("NullAway") // FIXME: Dataflow analysis limitation
8889
public EvaluationContext createEvaluationContext(Supplier<? extends @Nullable Authentication> authentication,
8990
MethodInvocation mi) {
9091
MethodSecurityExpressionOperations root = createSecurityExpressionRoot(authentication, mi);

core/src/main/java/org/springframework/security/access/vote/RoleVoter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import java.util.Collection;
2020

21+
import org.jspecify.annotations.NullUnmarked;
22+
2123
import org.springframework.security.access.AccessDecisionVoter;
2224
import org.springframework.security.access.ConfigAttribute;
2325
import org.springframework.security.core.Authentication;
@@ -53,6 +55,7 @@
5355
* instead
5456
*/
5557
@Deprecated
58+
@NullUnmarked
5659
public class RoleVoter implements AccessDecisionVoter<Object> {
5760

5861
private String rolePrefix = "ROLE_";

core/src/main/java/org/springframework/security/authentication/AuthenticationTrustResolver.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.jspecify.annotations.Nullable;
2020

21+
import org.springframework.lang.Contract;
2122
import org.springframework.security.core.Authentication;
2223

2324
/**
@@ -80,6 +81,7 @@ default boolean isFullyAuthenticated(@Nullable Authentication authentication) {
8081
* {@link Authentication#isAuthenticated()} is true.
8182
* @since 6.1.7
8283
*/
84+
@Contract("null -> false")
8385
default boolean isAuthenticated(@Nullable Authentication authentication) {
8486
return authentication != null && authentication.isAuthenticated() && !isAnonymous(authentication);
8587
}

0 commit comments

Comments
 (0)