Skip to content

Commit 0bc9313

Browse files
committed
Fix bug PublicKeyCredentialUserEntityRepository saves anonymousUser
Issue gh-16385 Signed-off-by: Borghi <137845283+Borghii@users.noreply.github.com>
1 parent 9468126 commit 0bc9313

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

web/src/main/java/org/springframework/security/web/webauthn/management/Webauthn4JRelyingPartyOperations.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.webauthn4j.data.extension.authenticator.RegistrationExtensionAuthenticatorOutput;
4747
import com.webauthn4j.server.ServerProperty;
4848

49+
import org.springframework.security.authentication.AnonymousAuthenticationToken;
4950
import org.springframework.security.authentication.AuthenticationTrustResolver;
5051
import org.springframework.security.authentication.AuthenticationTrustResolverImpl;
5152
import org.springframework.security.core.Authentication;
@@ -333,9 +334,7 @@ private static Set<AuthenticatorTransport> convertTransports(
333334
public PublicKeyCredentialRequestOptions createCredentialRequestOptions(
334335
PublicKeyCredentialRequestOptionsRequest request) {
335336
Authentication authentication = request.getAuthentication();
336-
// FIXME: do not load credentialRecords if anonymous
337-
PublicKeyCredentialUserEntity userEntity = findUserEntityOrCreateAndSave(authentication.getName());
338-
List<CredentialRecord> credentialRecords = this.userCredentials.findByUserId(userEntity.getId());
337+
List<CredentialRecord> credentialRecords = findCredentialRecords(authentication);
339338
return PublicKeyCredentialRequestOptions.builder()
340339
.allowCredentials(credentialDescriptors(credentialRecords))
341340
.challenge(Bytes.random())
@@ -346,6 +345,17 @@ public PublicKeyCredentialRequestOptions createCredentialRequestOptions(
346345
.build();
347346
}
348347

348+
private List<CredentialRecord> findCredentialRecords(Authentication authentication) {
349+
if (authentication instanceof AnonymousAuthenticationToken) {
350+
return Collections.emptyList();
351+
}
352+
PublicKeyCredentialUserEntity userEntity = this.userEntities.findByUsername(authentication.getName());
353+
if (userEntity == null) {
354+
return Collections.emptyList();
355+
}
356+
return this.userCredentials.findByUserId(userEntity.getId());
357+
}
358+
349359
@Override
350360
public PublicKeyCredentialUserEntity authenticate(RelyingPartyAuthenticationRequest request) {
351361
PublicKeyCredentialRequestOptions requestOptions = request.getRequestOptions();

web/src/test/java/org/springframework/security/web/webauthn/management/Webauthn4jRelyingPartyOperationsTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,18 @@ void createCredentialRequestOptionsThenUserVerificationSameAsCreation() {
536536
.isEqualTo(creationOptions.getAuthenticatorSelection().getUserVerification());
537537
}
538538

539+
@Test
540+
void shouldReturnEmptyCredentialsWhenUserIsAnonymous() {
541+
AnonymousAuthenticationToken authentication = new AnonymousAuthenticationToken("key", "anonymousUser",
542+
Set.of(() -> "ROLE_ANONYMOUS"));
543+
PublicKeyCredentialRequestOptionsRequest createRequest = new ImmutablePublicKeyCredentialRequestOptionsRequest(
544+
authentication);
545+
PublicKeyCredentialRequestOptions credentialRequestOptions = this.rpOperations
546+
.createCredentialRequestOptions(createRequest);
547+
548+
assertThat(credentialRequestOptions.getAllowCredentials()).isEmpty();
549+
}
550+
539551
private static AuthenticatorAttestationResponse setFlag(byte... flags) throws Exception {
540552
AuthenticatorAttestationResponseBuilder authAttResponseBldr = TestAuthenticatorAttestationResponse
541553
.createAuthenticatorAttestationResponse();

0 commit comments

Comments
 (0)