Skip to content

Commit 982b83d

Browse files
authored
Merge pull request #30161 from vonatzigenc/fix-different-behaviour-testidentityassociation
Align behavior for getDeferredIdentity and getIdentity in TestIdentityAssociation
2 parents f198672 + 81fb692 commit 982b83d

File tree

4 files changed

+103
-6
lines changed

4 files changed

+103
-6
lines changed

integration-tests/oidc-code-flow/src/main/java/io/quarkus/it/keycloak/ProtectedResource.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.quarkus.oidc.common.runtime.OidcConstants;
2525
import io.quarkus.security.Authenticated;
2626
import io.quarkus.security.identity.SecurityIdentity;
27+
import io.quarkus.security.runtime.SecurityIdentityAssociation;
2728
import io.vertx.ext.web.RoutingContext;
2829

2930
@Path("/web-app")
@@ -33,6 +34,9 @@ public class ProtectedResource {
3334
@Inject
3435
SecurityIdentity identity;
3536

37+
@Inject
38+
SecurityIdentityAssociation securityIdentityAssociation;
39+
3640
@Inject
3741
Principal principal;
3842

@@ -68,13 +72,15 @@ public class ProtectedResource {
6872
@Path("test-security")
6973
public String testSecurity() {
7074
return securityContext.getUserPrincipal().getName() + ":" + identity.getPrincipal().getName() + ":"
71-
+ principal.getName();
75+
+ principal.getName() + ":"
76+
+ securityIdentityAssociation.getDeferredIdentity().await().indefinitely().getPrincipal().getName();
7277
}
7378

7479
@GET
7580
@Path("test-security-oidc")
7681
public String testSecurityJwt() {
7782
return idToken.getName() + ":" + identity.getPrincipal().getName() + ":" + principal.getName()
83+
+ ":" + securityIdentityAssociation.getDeferredIdentity().await().indefinitely().getPrincipal().getName()
7884
+ ":" + idToken.getGroups().iterator().next()
7985
+ ":" + idToken.getClaim("email")
8086
+ ":" + userInfo.getString("sub")

integration-tests/oidc-code-flow/src/test/java/io/quarkus/it/keycloak/TestSecurityLazyAuthTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ public class TestSecurityLazyAuthTest {
2626
@TestSecurity(user = "user1", roles = "viewer")
2727
public void testWithDummyUser() {
2828
RestAssured.when().get("test-security").then()
29-
.body(is("user1:user1:user1"));
29+
.body(is("user1:user1:user1:user1"));
3030
}
3131

3232
@Test
3333
@TestSecurityMetaAnnotation
3434
public void testJwtWithDummyUser() {
3535
RestAssured.when().get("test-security-oidc").then()
36-
.body(is("userOidc:userOidc:userOidc:viewer:user@gmail.com:subject:aud"));
36+
.body(is("userOidc:userOidc:userOidc:userOidc:viewer:user@gmail.com:subject:aud"));
3737
}
3838

3939
@Retention(RetentionPolicy.RUNTIME)

test-framework/security/src/main/java/io/quarkus/test/security/TestIdentityAssociation.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,11 @@ public void setIdentity(Uni<SecurityIdentity> identity) {
5656

5757
@Override
5858
public Uni<SecurityIdentity> getDeferredIdentity() {
59-
if (testIdentity != null) {
60-
return Uni.createFrom().item(testIdentity);
59+
if (testIdentity == null) {
60+
return delegate.getDeferredIdentity();
6161
}
62-
return delegate.getDeferredIdentity();
62+
return delegate.getDeferredIdentity().onItem()
63+
.transform(underlying -> underlying.isAnonymous() ? testIdentity : underlying);
6364
}
6465

6566
@Override
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package io.quarkus.test.security;
2+
3+
import static io.quarkus.security.runtime.QuarkusSecurityIdentity.builder;
4+
import static org.junit.jupiter.api.Assertions.assertSame;
5+
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
import io.quarkus.runtime.BlockingOperationControl;
10+
import io.quarkus.runtime.IOThreadDetector;
11+
import io.quarkus.security.identity.SecurityIdentity;
12+
import io.quarkus.security.runtime.QuarkusPrincipal;
13+
import io.smallrye.mutiny.Uni;
14+
15+
public class TestIdentityAssociationTest {
16+
17+
TestIdentityAssociation sut;
18+
19+
@BeforeEach
20+
void init() {
21+
sut = new TestIdentityAssociation();
22+
sut.delegate = new DelegateSecurityIdentityAssociation();
23+
24+
BlockingOperationControl.setIoThreadDetector(new IOThreadDetector[0]);
25+
}
26+
27+
@Test
28+
void useDelegateIfTestIdentityIsNull() {
29+
// create anonymous identity
30+
SecurityIdentity mockedIdentity = builder().setAnonymous(true).build();
31+
Uni<SecurityIdentity> mockedIdentityUni = Uni.createFrom().item(mockedIdentity);
32+
sut.setIdentity(mockedIdentity);
33+
sut.setIdentity(mockedIdentityUni);
34+
35+
// reset testIdentity
36+
sut.setTestIdentity(null);
37+
38+
// get identity direct + deferred
39+
SecurityIdentity deferred = sut.getDeferredIdentity().await().indefinitely();
40+
SecurityIdentity identity = sut.getIdentity();
41+
42+
// must be the same instance
43+
assertSame(identity, deferred, "Must be same instance directly and deferred");
44+
assertSame(mockedIdentity, identity, "Expected delegate. (TestIdentity is null)");
45+
}
46+
47+
@Test
48+
void useTestIdentityIfDelegateIsAnonymous() {
49+
// create anonymous identity
50+
SecurityIdentity mockedIdentity = builder().setAnonymous(true).build();
51+
Uni<SecurityIdentity> mockedIdentityUni = Uni.createFrom().item(mockedIdentity);
52+
// create test identity
53+
SecurityIdentity mockedTestIdentity = builder().setPrincipal(new QuarkusPrincipal("test-identity")).build();
54+
sut.setIdentity(mockedIdentity);
55+
sut.setIdentity(mockedIdentityUni);
56+
57+
// reset testIdentity
58+
sut.setTestIdentity(mockedTestIdentity);
59+
60+
// get identity direct + deferred
61+
SecurityIdentity deferred = sut.getDeferredIdentity().await().indefinitely();
62+
SecurityIdentity identity = sut.getIdentity();
63+
64+
// must be the same instance
65+
assertSame(identity, deferred, "Must be same instance directly and deferred");
66+
assertSame(mockedTestIdentity, identity, "Expected testIdentity. (Delegate is anonymous)");
67+
}
68+
69+
@Test
70+
void useDelegateIfNotAnonymous() {
71+
// create identity with principal
72+
SecurityIdentity mockedIdentity = builder().setPrincipal(new QuarkusPrincipal("delegate")).build();
73+
Uni<SecurityIdentity> mockedIdentityUni = Uni.createFrom().item(mockedIdentity);
74+
// create test identity
75+
SecurityIdentity mockedTestIdentity = builder().setPrincipal(new QuarkusPrincipal("test-identity")).build();
76+
sut.setIdentity(mockedIdentity);
77+
sut.setIdentity(mockedIdentityUni);
78+
79+
// reset testIdentity
80+
sut.setTestIdentity(mockedTestIdentity);
81+
82+
// get identity direct + deferred
83+
SecurityIdentity deferred = sut.getDeferredIdentity().await().indefinitely();
84+
SecurityIdentity identity = sut.getIdentity();
85+
86+
// must be the same instance
87+
assertSame(identity, deferred, "Must be same instance directly and deferred");
88+
assertSame(mockedIdentity, identity, "Expected delegate. (Delegate is not anonymous)");
89+
}
90+
}

0 commit comments

Comments
 (0)