fix: restrict freight shipping permission
This commit is contained in:
parent
1deda4c663
commit
454a29ca51
@ -5,8 +5,11 @@ import com.alibaba.excel.EasyExcel;
|
|||||||
import com.red.circle.console.app.dto.clienobject.user.UserFreightBalanceCO;
|
import com.red.circle.console.app.dto.clienobject.user.UserFreightBalanceCO;
|
||||||
import com.red.circle.console.app.dto.clienobject.user.UserFreightBalanceRunningWaterCO;
|
import com.red.circle.console.app.dto.clienobject.user.UserFreightBalanceRunningWaterCO;
|
||||||
import com.red.circle.console.app.excel.model.freight.UserFreightBalanceRunningWaterExportModel;
|
import com.red.circle.console.app.excel.model.freight.UserFreightBalanceRunningWaterExportModel;
|
||||||
|
import com.red.circle.console.app.service.admin.UserAccountService;
|
||||||
import com.red.circle.console.app.service.app.user.UserFreightService;
|
import com.red.circle.console.app.service.app.user.UserFreightService;
|
||||||
import com.red.circle.console.infra.annotations.OpsOperationReqLog;
|
import com.red.circle.console.infra.annotations.OpsOperationReqLog;
|
||||||
|
import com.red.circle.console.inner.error.ConsoleErrorCode;
|
||||||
|
import com.red.circle.framework.core.asserts.ResponseAssert;
|
||||||
import com.red.circle.framework.dto.PageResult;
|
import com.red.circle.framework.dto.PageResult;
|
||||||
import com.red.circle.framework.web.controller.BaseController;
|
import com.red.circle.framework.web.controller.BaseController;
|
||||||
import com.red.circle.other.inner.model.cmd.user.UserFreightBalanceCmd;
|
import com.red.circle.other.inner.model.cmd.user.UserFreightBalanceCmd;
|
||||||
@ -42,8 +45,10 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class UserFreightRestController extends BaseController {
|
public class UserFreightRestController extends BaseController {
|
||||||
|
|
||||||
|
private static final String FREIGHT_SHIP_MENU_ALIAS = "user:freight:ship";
|
||||||
|
|
||||||
private final UserFreightService userFreightService;
|
private final UserFreightService userFreightService;
|
||||||
|
private final UserAccountService userAccountService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取代理账户信息-分页列表.
|
* 获取代理账户信息-分页列表.
|
||||||
@ -59,7 +64,11 @@ public class UserFreightRestController extends BaseController {
|
|||||||
@OpsOperationReqLog("货运代理-发货")
|
@OpsOperationReqLog("货运代理-发货")
|
||||||
@PostMapping("/ship")
|
@PostMapping("/ship")
|
||||||
public void ship(@RequestBody @Validated UserFreightBalanceCmd param) {
|
public void ship(@RequestBody @Validated UserFreightBalanceCmd param) {
|
||||||
param.setOperationUser(param.requiredReqUserId());
|
Long reqUserId = param.requiredReqUserId();
|
||||||
|
// 发货会直接增加币商余额,不能只依赖前端隐藏按钮,接口层必须再次校验显式按钮权限。
|
||||||
|
ResponseAssert.isTrue(ConsoleErrorCode.ACCOUNT_NOT_PERMISSIONS,
|
||||||
|
userAccountService.hasButtonsAlias(reqUserId.intValue(), FREIGHT_SHIP_MENU_ALIAS));
|
||||||
|
param.setOperationUser(reqUserId);
|
||||||
userFreightService.ship(param);
|
userFreightService.ship(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,56 @@
|
|||||||
|
package com.red.circle.console.adapter.app.user;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import com.red.circle.console.app.service.admin.UserAccountService;
|
||||||
|
import com.red.circle.console.app.service.app.user.UserFreightService;
|
||||||
|
import com.red.circle.other.inner.model.cmd.user.UserFreightBalanceCmd;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
class UserFreightRestControllerTest {
|
||||||
|
|
||||||
|
private static final Long ADMIN_USER_ID = 227L;
|
||||||
|
private static final String FREIGHT_SHIP_MENU_ALIAS = "user:freight:ship";
|
||||||
|
|
||||||
|
private UserFreightService userFreightService;
|
||||||
|
private UserAccountService userAccountService;
|
||||||
|
private UserFreightRestController controller;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
userFreightService = Mockito.mock(UserFreightService.class);
|
||||||
|
userAccountService = Mockito.mock(UserAccountService.class);
|
||||||
|
controller = new UserFreightRestController(userFreightService, userAccountService);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shipAllowsUserWithExplicitPermission() {
|
||||||
|
UserFreightBalanceCmd cmd = new UserFreightBalanceCmd();
|
||||||
|
cmd.setReqUserId(ADMIN_USER_ID);
|
||||||
|
when(userAccountService.hasButtonsAlias(ADMIN_USER_ID.intValue(), FREIGHT_SHIP_MENU_ALIAS))
|
||||||
|
.thenReturn(true);
|
||||||
|
|
||||||
|
controller.ship(cmd);
|
||||||
|
|
||||||
|
verify(userFreightService).ship(cmd);
|
||||||
|
org.assertj.core.api.Assertions.assertThat(cmd.getOperationUser()).isEqualTo(ADMIN_USER_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shipRejectsUserWithoutExplicitPermission() {
|
||||||
|
UserFreightBalanceCmd cmd = new UserFreightBalanceCmd();
|
||||||
|
cmd.setReqUserId(ADMIN_USER_ID);
|
||||||
|
when(userAccountService.hasButtonsAlias(ADMIN_USER_ID.intValue(), FREIGHT_SHIP_MENU_ALIAS))
|
||||||
|
.thenReturn(false);
|
||||||
|
|
||||||
|
// 无权限账号必须在进入余额变更服务前被拒绝,防止绕过前端直接调用接口发货。
|
||||||
|
assertThrows(RuntimeException.class, () -> controller.ship(cmd));
|
||||||
|
|
||||||
|
verify(userFreightService, never()).ship(cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user