From 50251240f467f626962c23a7d3d65a7022a514bf Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 13 Aug 2026 19:23:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/baiyue/auth/service/AuthService.java | 5 +-- .../auth/service/AuthServiceSmallJwtTest.java | 42 +++++++++++++++++-- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/auth/src/main/java/com/baiyue/auth/service/AuthService.java b/auth/src/main/java/com/baiyue/auth/service/AuthService.java index f9be566f8..72a8dab9d 100644 --- a/auth/src/main/java/com/baiyue/auth/service/AuthService.java +++ b/auth/src/main/java/com/baiyue/auth/service/AuthService.java @@ -124,8 +124,6 @@ public class AuthService { .claim("userId", account.getId()) .claim("tenantId", account.getDefaultTenantId()) .claim("appCode", account.getDefaultAppCode()) - .claim("roles", authorization.getRoles()) - .claim("authorities", authorization.getPermissions()) .claim("permissionVersion", account.getTokenVersion()) .build(); String accessToken = jwtEncoder.encode(JwtEncoderParameters.from( @@ -183,8 +181,7 @@ public class AuthService { .claim("membership_id", account.getDefaultMembershipId()).claim("app_code", "MERCHANT") .claim("client_type", authorization.getClientType()).claim("token_version", account.getTokenVersion()) .claim("userId", account.getId()).claim("tenantId", account.getDefaultTenantId()) - .claim("appCode", "MERCHANT").claim("roles", authorization.getRoles()) - .claim("authorities", authorization.getPermissions()) + .claim("appCode", "MERCHANT") .claim("permissionVersion", account.getTokenVersion()) .claim("impersonated", true).claim("impersonation_id", ticket.ticketId()) .claim("actor_user_id", ticket.actorUserId()).claim("actor_membership_id", ticket.actorMembershipId()) diff --git a/auth/src/test/java/com/baiyue/auth/service/AuthServiceSmallJwtTest.java b/auth/src/test/java/com/baiyue/auth/service/AuthServiceSmallJwtTest.java index 517d0f459..0d8e3851b 100644 --- a/auth/src/test/java/com/baiyue/auth/service/AuthServiceSmallJwtTest.java +++ b/auth/src/test/java/com/baiyue/auth/service/AuthServiceSmallJwtTest.java @@ -77,11 +77,9 @@ class AuthServiceSmallJwtTest { .containsEntry("userId", 42L) .containsEntry("tenantId", 0L) .containsEntry("appCode", "PLATFORM") - .containsEntry("roles", Set.of("PLATFORM_ADMIN")) - .containsEntry("authorities", Set.of("platform:order:list")) .containsEntry("permissionVersion", 1) .containsEntry("membership_id", 84L) - .doesNotContainKeys("permissions", "scope"); + .doesNotContainKeys("roles", "authorities", "permissions", "scope"); assertThat(jwt.getValue().getClaims().getAudience()).containsExactly("lastleg-api"); assertThat(jwt.getValue().getJwsHeader().getAlgorithm()).isEqualTo(MacAlgorithm.HS256); assertThat(jwt.getValue().getJwsHeader().getKeyId()).isNull(); @@ -91,4 +89,42 @@ class AuthServiceSmallJwtTest { org.mockito.ArgumentMatchers.eq(Duration.ofMinutes(30)), 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 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))); + } }