fix(security): require tool guard rule id (#88)

This commit is contained in:
matevip 2026-05-10 08:02:15 +08:00
parent f7c1af80a4
commit 4567bd6019
4 changed files with 28 additions and 4 deletions

View File

@ -64,6 +64,10 @@ public class ToolGuardRuleService {
* 新增自定义规则 * 新增自定义规则
*/ */
public ToolGuardRuleEntity createRule(ToolGuardRuleEntity rule) { public ToolGuardRuleEntity createRule(ToolGuardRuleEntity rule) {
if (rule == null || rule.getRuleId() == null || rule.getRuleId().isBlank()) {
throw new IllegalArgumentException("Rule ID is required");
}
rule.setRuleId(rule.getRuleId().trim());
rule.setBuiltin(false); rule.setBuiltin(false);
ruleMapper.insert(rule); ruleMapper.insert(rule);
ruleRegistry.reload(); ruleRegistry.reload();

View File

@ -1340,6 +1340,10 @@ export default {
remediation: 'Remediation', remediation: 'Remediation',
priority: 'Priority', priority: 'Priority',
}, },
messages: {
ruleIdRequired: 'Rule ID is required',
saveFailed: 'Failed to save rule',
},
}, },
fileGuard: { fileGuard: {
title: 'File Guard', title: 'File Guard',

View File

@ -1238,6 +1238,10 @@ export default {
remediation: '修复建议', remediation: '修复建议',
priority: '优先级', priority: '优先级',
}, },
messages: {
ruleIdRequired: '规则 ID 不能为空',
saveFailed: '保存规则失败',
},
}, },
fileGuard: { fileGuard: {
title: '文件防护', title: '文件防护',

View File

@ -146,8 +146,13 @@
<div class="modal-body"> <div class="modal-body">
<div class="form-grid"> <div class="form-grid">
<div class="form-group" v-if="!editingRule"> <div class="form-group" v-if="!editingRule">
<label>{{ t('security.toolGuard.fields.ruleId') }}</label> <label>{{ t('security.toolGuard.fields.ruleId') }} <span class="required">*</span></label>
<input v-model="ruleForm.ruleId" class="form-input" placeholder="CUSTOM_RULE_001" /> <input
v-model.trim="ruleForm.ruleId"
class="form-input"
placeholder="CUSTOM_RULE_001"
required
/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label>{{ t('security.toolGuard.fields.name') }}</label> <label>{{ t('security.toolGuard.fields.name') }}</label>
@ -215,6 +220,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, onMounted } from 'vue' import { ref, reactive, onMounted } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus'
import { securityApi } from '@/api' import { securityApi } from '@/api'
import { parseJsonArray } from '../composables/helpers' import { parseJsonArray } from '../composables/helpers'
import type { GuardRule } from '@/types' import type { GuardRule } from '@/types'
@ -350,6 +356,11 @@ function openEditRuleModal(rule: GuardRule) {
} }
async function saveRule() { async function saveRule() {
if (!editingRule.value && !ruleForm.ruleId.trim()) {
ElMessage.error(t('security.toolGuard.messages.ruleIdRequired'))
return
}
try { try {
if (editingRule.value) { if (editingRule.value) {
await securityApi.updateRule(editingRule.value.ruleId, ruleForm) await securityApi.updateRule(editingRule.value.ruleId, ruleForm)
@ -358,8 +369,8 @@ async function saveRule() {
} }
showRuleModal.value = false showRuleModal.value = false
loadRules() loadRules()
} catch { } catch (e: any) {
// ignore ElMessage.error(e?.msg || e?.message || t('security.toolGuard.messages.saveFailed'))
} }
} }
@ -398,6 +409,7 @@ onMounted(async () => {
.subsection-title { font-size: 16px; font-weight: 600; color: var(--mc-text-primary); margin: 0 0 12px; } .subsection-title { font-size: 16px; font-weight: 600; color: var(--mc-text-primary); margin: 0 0 12px; }
.rule-name { font-weight: 500; } .rule-name { font-weight: 500; }
.required { color: var(--mc-danger, #ef4444); }
.rule-pattern { .rule-pattern {
font-family: 'SF Mono', 'Fira Code', monospace; font-family: 'SF Mono', 'Fira Code', monospace;
font-size: 11px; font-size: 11px;