Skip to content

Commit 68f81b8

Browse files
committed
Mark GrantedAuthority#getAuthority as @Nullable
Closes: gh-17999 Signed-off-by: Andrey Litvitski <[email protected]>
1 parent 83da86a commit 68f81b8

File tree

5 files changed

+17
-10
lines changed

5 files changed

+17
-10
lines changed

core/src/main/java/org/springframework/security/authorization/AuthorityReactiveAuthorizationManager.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.security.authorization;
1818

1919
import java.util.List;
20+
import java.util.Objects;
2021

2122
import reactor.core.publisher.Mono;
2223

@@ -47,8 +48,8 @@ public Mono<AuthorizationResult> authorize(Mono<Authentication> authentication,
4748
// @formatter:off
4849
return authentication.filter(Authentication::isAuthenticated)
4950
.flatMapIterable(Authentication::getAuthorities)
50-
.map(GrantedAuthority::getAuthority)
51-
.any((grantedAuthority) -> this.authorities.stream().anyMatch((authority) -> authority.getAuthority().equals(grantedAuthority)))
51+
.mapNotNull(GrantedAuthority::getAuthority)
52+
.any((grantedAuthority) -> this.authorities.stream().anyMatch((authority) -> Objects.equals(authority.getAuthority(), grantedAuthority)))
5253
.map((granted) -> ((AuthorizationResult) new AuthorityAuthorizationDecision(granted, this.authorities)))
5354
.defaultIfEmpty(new AuthorityAuthorizationDecision(false, this.authorities));
5455
// @formatter:on

core/src/main/java/org/springframework/security/core/GrantedAuthority.java

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

1919
import java.io.Serializable;
2020

21+
import org.jspecify.annotations.Nullable;
22+
2123
import org.springframework.security.authorization.AuthorizationManager;
2224

2325
/**
@@ -46,6 +48,6 @@ public interface GrantedAuthority extends Serializable {
4648
* granted authority cannot be expressed as a <code>String</code> with sufficient
4749
* precision).
4850
*/
49-
String getAuthority();
51+
@Nullable String getAuthority();
5052

5153
}

core/src/main/java/org/springframework/security/core/authority/mapping/SimpleAuthorityMapper.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,10 @@ public void afterPropertiesSet() {
6464
public Set<GrantedAuthority> mapAuthorities(Collection<? extends GrantedAuthority> authorities) {
6565
HashSet<GrantedAuthority> mapped = new HashSet<>(authorities.size());
6666
for (GrantedAuthority authority : authorities) {
67-
mapped.add(mapAuthority(authority.getAuthority()));
67+
String authorityStr = authority.getAuthority();
68+
if (authorityStr != null) {
69+
mapped.add(mapAuthority(authorityStr));
70+
}
6871
}
6972
if (this.defaultAuthority != null) {
7073
mapped.add(this.defaultAuthority);

test/src/main/java/org/springframework/security/test/web/servlet/response/SecurityMockMvcResultMatchers.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,8 @@ public AuthenticatedMatcher withRoles(String rolePrefix, String[] roles) {
281281
for (String role : roles) {
282282
withPrefix.add(new SimpleGrantedAuthority(rolePrefix + role));
283283
}
284-
this.ignoreAuthorities = (authority) -> !authority.getAuthority().startsWith(rolePrefix);
284+
this.ignoreAuthorities = (authority) -> (authority.getAuthority() != null
285+
&& !authority.getAuthority().startsWith(rolePrefix));
285286
return withAuthorities(withPrefix);
286287
}
287288

web/src/main/java/org/springframework/security/web/access/DelegatingMissingAuthorityAccessDeniedHandler.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,12 @@ private List<AuthorityRequiredFactorErrorEntry> authorityErrors(AccessDeniedExce
160160
return authorityDecision.getAuthorities().stream()
161161
.map((grantedAuthority) -> {
162162
String authority = grantedAuthority.getAuthority();
163-
if (authority.startsWith("FACTOR_")) {
163+
if (authority != null && authority.startsWith("FACTOR_")) {
164164
RequiredFactor required = RequiredFactor.withAuthority(authority).build();
165165
return new AuthorityRequiredFactorErrorEntry(authority, RequiredFactorError.createMissing(required));
166166
}
167167
else {
168-
return new AuthorityRequiredFactorErrorEntry(authority, null);
168+
return new AuthorityRequiredFactorErrorEntry(null, null);
169169
}
170170
})
171171
.collect(Collectors.toList());
@@ -247,17 +247,17 @@ public DelegatingMissingAuthorityAccessDeniedHandler build() {
247247
*/
248248
private static final class AuthorityRequiredFactorErrorEntry {
249249

250-
private final String authority;
250+
@Nullable private final String authority;
251251

252252
private final @Nullable RequiredFactorError error;
253253

254-
private AuthorityRequiredFactorErrorEntry(String authority, @Nullable RequiredFactorError error) {
254+
private AuthorityRequiredFactorErrorEntry(@Nullable String authority, @Nullable RequiredFactorError error) {
255255
Assert.notNull(authority, "authority cannot be null");
256256
this.authority = authority;
257257
this.error = error;
258258
}
259259

260-
private String getAuthority() {
260+
@Nullable private String getAuthority() {
261261
return this.authority;
262262
}
263263

0 commit comments

Comments
 (0)