|
1 | 1 | /*
|
2 |
| - * Copyright 2002-2024 the original author or authors. |
| 2 | + * Copyright 2002-2025 the original author or authors. |
3 | 3 | *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | 5 | * you may not use this file except in compliance with the License.
|
|
42 | 42 | import org.springframework.security.authentication.AnonymousAuthenticationToken;
|
43 | 43 | import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
44 | 44 | import org.springframework.security.core.authority.AuthorityUtils;
|
| 45 | +import org.springframework.security.core.userdetails.PasswordEncodedUser; |
| 46 | +import org.springframework.security.core.userdetails.UserDetails; |
45 | 47 | import org.springframework.security.web.webauthn.api.AuthenticatorAttestationResponse;
|
46 | 48 | import org.springframework.security.web.webauthn.api.AuthenticatorAttestationResponse.AuthenticatorAttestationResponseBuilder;
|
47 | 49 | import org.springframework.security.web.webauthn.api.AuthenticatorSelectionCriteria;
|
|
66 | 68 | import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
67 | 69 | import static org.assertj.core.api.Assertions.assertThatRuntimeException;
|
68 | 70 | import static org.mockito.BDDMockito.given;
|
| 71 | +import static org.mockito.Mockito.verifyNoInteractions; |
69 | 72 |
|
70 | 73 | @ExtendWith(MockitoExtension.class)
|
71 | 74 | class Webauthn4jRelyingPartyOperationsTests {
|
@@ -536,6 +539,50 @@ void createCredentialRequestOptionsThenUserVerificationSameAsCreation() {
|
536 | 539 | .isEqualTo(creationOptions.getAuthenticatorSelection().getUserVerification());
|
537 | 540 | }
|
538 | 541 |
|
| 542 | + @Test |
| 543 | + void createCredentialRequestOptionsWhenAnonymousAuthentication() { |
| 544 | + AnonymousAuthenticationToken authentication = new AnonymousAuthenticationToken("key", "anonymousUser", |
| 545 | + Set.of(() -> "ROLE_ANONYMOUS")); |
| 546 | + PublicKeyCredentialRequestOptionsRequest createRequest = new ImmutablePublicKeyCredentialRequestOptionsRequest( |
| 547 | + authentication); |
| 548 | + PublicKeyCredentialRequestOptions credentialRequestOptions = this.rpOperations |
| 549 | + .createCredentialRequestOptions(createRequest); |
| 550 | + |
| 551 | + assertThat(credentialRequestOptions.getAllowCredentials()).isEmpty(); |
| 552 | + // verify anonymous user not saved |
| 553 | + verifyNoInteractions(this.userEntities); |
| 554 | + } |
| 555 | + |
| 556 | + @Test |
| 557 | + void createCredentialRequestOptionsWhenNullAuthentication() { |
| 558 | + PublicKeyCredentialRequestOptionsRequest createRequest = new ImmutablePublicKeyCredentialRequestOptionsRequest( |
| 559 | + null); |
| 560 | + PublicKeyCredentialRequestOptions credentialRequestOptions = this.rpOperations |
| 561 | + .createCredentialRequestOptions(createRequest); |
| 562 | + |
| 563 | + assertThat(credentialRequestOptions.getAllowCredentials()).isEmpty(); |
| 564 | + // verify anonymous user not saved |
| 565 | + verifyNoInteractions(this.userEntities); |
| 566 | + } |
| 567 | + |
| 568 | + @Test |
| 569 | + void createCredentialRequestOptionsWhenAuthenticated() { |
| 570 | + UserDetails user = PasswordEncodedUser.user(); |
| 571 | + UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, null, |
| 572 | + user.getAuthorities()); |
| 573 | + PublicKeyCredentialUserEntity userEntity = TestPublicKeyCredentialUserEntity.userEntity().build(); |
| 574 | + CredentialRecord credentialRecord = TestCredentialRecord.userCredential().build(); |
| 575 | + given(this.userEntities.findByUsername(user.getUsername())).willReturn(userEntity); |
| 576 | + given(this.userCredentials.findByUserId(userEntity.getId())).willReturn(Arrays.asList(credentialRecord)); |
| 577 | + PublicKeyCredentialRequestOptionsRequest createRequest = new ImmutablePublicKeyCredentialRequestOptionsRequest( |
| 578 | + auth); |
| 579 | + PublicKeyCredentialRequestOptions credentialRequestOptions = this.rpOperations |
| 580 | + .createCredentialRequestOptions(createRequest); |
| 581 | + |
| 582 | + assertThat(credentialRequestOptions.getAllowCredentials()).extracting(PublicKeyCredentialDescriptor::getId) |
| 583 | + .containsExactly(credentialRecord.getCredentialId()); |
| 584 | + } |
| 585 | + |
539 | 586 | private static AuthenticatorAttestationResponse setFlag(byte... flags) throws Exception {
|
540 | 587 | AuthenticatorAttestationResponseBuilder authAttResponseBldr = TestAuthenticatorAttestationResponse
|
541 | 588 | .createAuthenticatorAttestationResponse();
|
|
0 commit comments