This commit is contained in:
2026-08-13 14:37:51 +08:00
parent bc62650ca9
commit 65cd7e0a39
63 changed files with 380 additions and 226 deletions
@@ -15,20 +15,20 @@ class FinancePhase1PermissionContractTest {
@Test
void freezesG1AndG2ControllerPermissionsAndHttpActions() throws Exception {
assertEndpoint("listDerivedCustomerAccounts", GetMapping.class,
"platform:finance:customer-account:list", "platform:finance:account:view",
"platform:finance:customer-account:list",
int.class, int.class, String.class, String.class);
assertEndpoint("listDerivedCustomerAccountLedger", GetMapping.class,
"platform:finance:customer-account:list", "platform:finance:account:view",
"platform:finance:customer-account:list",
long.class, int.class, int.class,
String.class, java.time.LocalDate.class, java.time.LocalDate.class);
assertEndpoint("getFinanceFeeSource", GetMapping.class,
"platform:finance:customer-arap:list", "platform:finance:fee-source:view", long.class);
"platform:finance:customer-arap:list", long.class);
assertEndpoint("reviewFinanceFeeSource", PostMapping.class,
"platform:finance:fee-source:review", null,
"platform:finance:fee-source:review",
com.baiyue.common.security.AuthenticatedUser.class, long.class, String.class,
com.baiyue.finance.dto.FinancePhase1Dtos.ReviewRequest.class);
assertEndpoint("updateFeeSourceSettlementInclusion", PutMapping.class,
"platform:finance:fee-source:settlement", null,
"platform:finance:fee-source:settlement",
com.baiyue.common.security.AuthenticatedUser.class, long.class, String.class,
com.baiyue.finance.dto.FinancePhase1Dtos.SettlementInclusionRequest.class);
}
@@ -36,13 +36,10 @@ class FinancePhase1PermissionContractTest {
private static void assertEndpoint(String methodName,
Class<? extends java.lang.annotation.Annotation> mapping,
String authority,
String compatibleAuthority,
Class<?>... parameterTypes) throws Exception {
Method method = FinancePhase1OperationController.class.getMethod(methodName, parameterTypes);
assertThat(method.isAnnotationPresent(mapping)).isTrue();
assertThat(method.getAnnotation(PreAuthorize.class).value()).contains(authority);
if (compatibleAuthority != null) {
assertThat(method.getAnnotation(PreAuthorize.class).value()).contains(compatibleAuthority);
}
assertThat(method.getAnnotation(PreAuthorize.class).value()).doesNotContain(":view");
}
}
@@ -2,6 +2,8 @@ package com.baiyue.finance;
import com.baiyue.finance.controller.PlatformFinanceController;
import com.baiyue.finance.controller.FinanceSettlementController;
import com.baiyue.finance.controller.FinancePhase1OperationController;
import com.baiyue.finance.controller.ReconciliationStatementController;
import io.swagger.v3.oas.annotations.Parameter;
import org.junit.jupiter.api.Test;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -30,10 +32,35 @@ class FinancePlatformListContractTest {
Map<String, String> expected = Map.of(
"feePool", "platform:finance:customer-arap:list",
"statements", "platform:finance:customer-statement:list",
"receivableSettlements", "platform:finance:settlement-ar:view",
"payableSettlements", "platform:finance:settlement-ap:view");
"receivableSettlements", "platform:finance:settlement-ar:list",
"payableSettlements", "platform:finance:settlement-ap:list");
for (var entry : expected.entrySet()) {
assertThat(find(entry.getKey()).getAnnotation(PreAuthorize.class).value()).contains(entry.getValue());
assertThat(find(entry.getKey()).getAnnotation(PreAuthorize.class).value())
.contains(entry.getValue())
.doesNotContain(":view");
}
}
@Test
void platformReadEndpointsDoNotAcceptLegacyViewAuthorities() {
String[] legacyAuthorities = {
"platform:finance:account:view",
"platform:finance:fee-source:view",
"platform:finance:bill:view",
"platform:finance:settlement-ar:view",
"platform:finance:settlement-ap:view"
};
for (Class<?> controller : new Class<?>[]{
PlatformFinanceController.class,
FinancePhase1OperationController.class,
ReconciliationStatementController.class,
FinanceSettlementController.class
}) {
for (Method method : controller.getDeclaredMethods()) {
PreAuthorize permission = method.getAnnotation(PreAuthorize.class);
if (permission == null) continue;
assertThat(permission.value()).doesNotContain(legacyAuthorities);
}
}
}
@@ -54,7 +54,7 @@ class FinanceSettlementBehaviorTest {
FinanceSettlementController controller = new FinanceSettlementController(controllerService);
SettlementDetail payable = detail("PAYABLE", "ISSUED", BigDecimal.ZERO, new BigDecimal("100.00"), 0);
when(controllerService.getSettlement(88L)).thenReturn(payable);
AuthenticatedUser apViewer = user(Set.of("platform:finance:settlement-ap:view"));
AuthenticatedUser apViewer = user(Set.of("platform:finance:settlement-ap:list"));
var response = controller.getSettlement(apViewer, 88L);
@@ -62,7 +62,7 @@ class FinanceSettlementBehaviorTest {
assertThat(response.data()).isSameAs(payable);
assertThat(response.requestId()).isNotBlank();
assertThatThrownBy(() -> controller.getSettlement(
user(Set.of("platform:finance:settlement-ar:view")), 88L)).isInstanceOf(AccessDeniedException.class);
user(Set.of("platform:finance:settlement-ar:list")), 88L)).isInstanceOf(AccessDeniedException.class);
}
@Test