优化
This commit is contained in:
@@ -124,8 +124,6 @@ public class AuthService {
|
|||||||
.claim("userId", account.getId())
|
.claim("userId", account.getId())
|
||||||
.claim("tenantId", account.getDefaultTenantId())
|
.claim("tenantId", account.getDefaultTenantId())
|
||||||
.claim("appCode", account.getDefaultAppCode())
|
.claim("appCode", account.getDefaultAppCode())
|
||||||
.claim("roles", authorization.getRoles())
|
|
||||||
.claim("authorities", authorization.getPermissions())
|
|
||||||
.claim("permissionVersion", account.getTokenVersion())
|
.claim("permissionVersion", account.getTokenVersion())
|
||||||
.build();
|
.build();
|
||||||
String accessToken = jwtEncoder.encode(JwtEncoderParameters.from(
|
String accessToken = jwtEncoder.encode(JwtEncoderParameters.from(
|
||||||
@@ -183,8 +181,7 @@ public class AuthService {
|
|||||||
.claim("membership_id", account.getDefaultMembershipId()).claim("app_code", "MERCHANT")
|
.claim("membership_id", account.getDefaultMembershipId()).claim("app_code", "MERCHANT")
|
||||||
.claim("client_type", authorization.getClientType()).claim("token_version", account.getTokenVersion())
|
.claim("client_type", authorization.getClientType()).claim("token_version", account.getTokenVersion())
|
||||||
.claim("userId", account.getId()).claim("tenantId", account.getDefaultTenantId())
|
.claim("userId", account.getId()).claim("tenantId", account.getDefaultTenantId())
|
||||||
.claim("appCode", "MERCHANT").claim("roles", authorization.getRoles())
|
.claim("appCode", "MERCHANT")
|
||||||
.claim("authorities", authorization.getPermissions())
|
|
||||||
.claim("permissionVersion", account.getTokenVersion())
|
.claim("permissionVersion", account.getTokenVersion())
|
||||||
.claim("impersonated", true).claim("impersonation_id", ticket.ticketId())
|
.claim("impersonated", true).claim("impersonation_id", ticket.ticketId())
|
||||||
.claim("actor_user_id", ticket.actorUserId()).claim("actor_membership_id", ticket.actorMembershipId())
|
.claim("actor_user_id", ticket.actorUserId()).claim("actor_membership_id", ticket.actorMembershipId())
|
||||||
|
|||||||
@@ -77,11 +77,9 @@ class AuthServiceSmallJwtTest {
|
|||||||
.containsEntry("userId", 42L)
|
.containsEntry("userId", 42L)
|
||||||
.containsEntry("tenantId", 0L)
|
.containsEntry("tenantId", 0L)
|
||||||
.containsEntry("appCode", "PLATFORM")
|
.containsEntry("appCode", "PLATFORM")
|
||||||
.containsEntry("roles", Set.of("PLATFORM_ADMIN"))
|
|
||||||
.containsEntry("authorities", Set.of("platform:order:list"))
|
|
||||||
.containsEntry("permissionVersion", 1)
|
.containsEntry("permissionVersion", 1)
|
||||||
.containsEntry("membership_id", 84L)
|
.containsEntry("membership_id", 84L)
|
||||||
.doesNotContainKeys("permissions", "scope");
|
.doesNotContainKeys("roles", "authorities", "permissions", "scope");
|
||||||
assertThat(jwt.getValue().getClaims().getAudience()).containsExactly("lastleg-api");
|
assertThat(jwt.getValue().getClaims().getAudience()).containsExactly("lastleg-api");
|
||||||
assertThat(jwt.getValue().getJwsHeader().getAlgorithm()).isEqualTo(MacAlgorithm.HS256);
|
assertThat(jwt.getValue().getJwsHeader().getAlgorithm()).isEqualTo(MacAlgorithm.HS256);
|
||||||
assertThat(jwt.getValue().getJwsHeader().getKeyId()).isNull();
|
assertThat(jwt.getValue().getJwsHeader().getKeyId()).isNull();
|
||||||
@@ -91,4 +89,42 @@ class AuthServiceSmallJwtTest {
|
|||||||
org.mockito.ArgumentMatchers.eq(Duration.ofMinutes(30)),
|
org.mockito.ArgumentMatchers.eq(Duration.ofMinutes(30)),
|
||||||
org.mockito.ArgumentMatchers.eq(Duration.ofDays(7)));
|
org.mockito.ArgumentMatchers.eq(Duration.ofDays(7)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void impersonationTokenAlsoKeepsRolesAndPermissionsOutOfJwt() {
|
||||||
|
AuthAccount account = new AuthAccount();
|
||||||
|
account.setId(43L);
|
||||||
|
account.setUsername("merchant-owner");
|
||||||
|
account.setAccountStatus("ACTIVE");
|
||||||
|
account.setDefaultTenantId(10001L);
|
||||||
|
account.setOperatorTenantId(0L);
|
||||||
|
account.setDefaultMembershipId(85L);
|
||||||
|
account.setDefaultAppCode("MERCHANT");
|
||||||
|
account.setTokenVersion(2);
|
||||||
|
AuthorizationSnapshot snapshot = new AuthorizationSnapshot(43L, 10001L, 85L, "MERCHANT",
|
||||||
|
"WEB", Set.of("MERCHANT_OWNER"), Set.of("merchant:order:list"));
|
||||||
|
Jwt encoded = org.mockito.Mockito.mock(Jwt.class);
|
||||||
|
TokenSessionStore.ImpersonationTicket ticket = new TokenSessionStore.ImpersonationTicket(
|
||||||
|
"ticket-1", 43L, 10001L, 85L, 42L, 84L, "support");
|
||||||
|
|
||||||
|
when(tokenSessionStore.consumeImpersonationTicket("one-time-code")).thenReturn(ticket);
|
||||||
|
when(repository.findById(43L)).thenReturn(account);
|
||||||
|
when(authorizationLoader.load(account)).thenReturn(snapshot);
|
||||||
|
when(jwtEncoder.encode(any())).thenReturn(encoded);
|
||||||
|
when(encoded.getTokenValue()).thenReturn("small-impersonation-token");
|
||||||
|
|
||||||
|
service.exchangeImpersonationTicket("one-time-code");
|
||||||
|
|
||||||
|
ArgumentCaptor<JwtEncoderParameters> jwt = ArgumentCaptor.forClass(JwtEncoderParameters.class);
|
||||||
|
verify(jwtEncoder).encode(jwt.capture());
|
||||||
|
assertThat(jwt.getValue().getClaims().getClaims())
|
||||||
|
.containsEntry("appCode", "MERCHANT")
|
||||||
|
.containsEntry("impersonated", true)
|
||||||
|
.containsEntry("membership_id", 85L)
|
||||||
|
.doesNotContainKeys("roles", "authorities", "permissions", "scope");
|
||||||
|
verify(tokenSessionStore).storeAccessOnly(any(), org.mockito.ArgumentMatchers.eq(43L),
|
||||||
|
org.mockito.ArgumentMatchers.eq(Set.of("MERCHANT_OWNER")),
|
||||||
|
org.mockito.ArgumentMatchers.eq(Set.of("merchant:order:list")),
|
||||||
|
org.mockito.ArgumentMatchers.eq(Duration.ofMinutes(15)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user