fix(aihr): protect demo sop review bypass

This commit is contained in:
2026-07-14 12:54:39 +08:00
parent 6ee29aa8b8
commit aa7e15087b
4 changed files with 28 additions and 1 deletions
@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.stp.StpUtil;
import lombok.RequiredArgsConstructor;
import org.dromara.aihr.domain.AihrSopDto.AnswerFeedbackItemResponse;
import org.dromara.aihr.domain.AihrSopDto.AnswerFeedbackRequest;
@@ -52,6 +53,7 @@ import java.util.List;
public class AihrSopController {
private static final String HR_OPERATOR_ROLE = "hr_operator";
private static final String DEMO_VERIFY_SOURCE = "verify_demo_questions";
private final AihrSopSeedService sopSeedService;
private final AihrUploadQueueService uploadQueueService;
@@ -80,7 +82,15 @@ public class AihrSopController {
@SaCheckLogin
@PostMapping("/search")
public R<SearchResponse> search(@RequestBody SearchRequest request) {
return R.ok(sopSeedService.search(request));
return R.ok(sopSeedService.search(restrictDemoVerificationSource(request)));
}
private SearchRequest restrictDemoVerificationSource(SearchRequest request) {
if (request == null || !DEMO_VERIFY_SOURCE.equals(request.source())
|| StpUtil.hasRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)) {
return request;
}
return new SearchRequest(request.queryText(), request.category(), request.position(), "knowledge_search", request.limit());
}
@GetMapping("/position-sop")
@@ -139,6 +139,20 @@ public class AihrSopSeedServiceTest {
assertTrue(code.contains("reviewSearch(id, request, operator)"));
}
@Test
@Tag("dev")
public void demoVerificationSourceIsRestrictedToSuperAdmin() throws Exception {
Path source = Path.of("src/main/java/org/dromara/aihr/controller/AihrSopController.java");
if (!Files.exists(source)) {
source = Path.of("ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrSopController.java");
}
String code = Files.readString(source);
assertTrue(code.contains("DEMO_VERIFY_SOURCE = \"verify_demo_questions\""));
assertTrue(code.contains("StpUtil.hasRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)"));
assertTrue(code.contains("restrictDemoVerificationSource(request)"));
}
@Test
@Tag("dev")
public void answerFeedbackReviewUsesAuthenticatedOperatorForAuditTrail() throws Exception {