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) {
if (rule == null || rule.getRuleId() == null || rule.getRuleId().isBlank()) {
throw new IllegalArgumentException("Rule ID is required");
}
rule.setRuleId(rule.getRuleId().trim());
rule.setBuiltin(false);
ruleMapper.insert(rule);
ruleRegistry.reload();

View File

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

View File

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

View File

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