RuoYi-Vue安全加固实战:从漏洞诊断到合规落地的全流程方案
引言:企业级应用的安全挑战与合规要求
在数字化转型加速的今天,企业级应用面临着日益复杂的安全威胁。作为基于SpringBoot和Vue的主流权限管理系统,RuoYi-Vue在提供便捷开发体验的同时,也需要应对严格的安全合规要求。本文将通过"问题诊断-方案设计-实施验证"的三阶结构,系统阐述如何构建全方位的安全防护体系,帮助企业快速满足等保三级等合规标准。
一、安全现状诊断:框架潜在风险点剖析
1.1 身份认证机制的薄弱环节
当前框架在身份认证方面存在以下风险:
- 密码策略强度不足,缺乏有效的复杂度校验
- 会话管理机制存在缺陷,JWT令牌有效期过长
- 缺乏多因素认证支持,单一密码认证风险较高
1.2 权限控制体系的不足
权限管理方面主要存在以下问题:
- 权限粒度不够精细,按钮级权限控制不完善
- 数据权限分离不彻底,存在越权访问风险
- 权限继承机制缺失,角色管理灵活性不足
1.3 数据保护措施的缺失
数据安全方面存在以下隐患:
- 敏感数据传输未加密,存在中间人攻击风险
- 数据存储缺乏有效的加密保护
- 缺乏数据脱敏机制,敏感信息暴露风险高
1.4 审计日志系统的缺陷
审计日志方面主要问题:
- 日志记录不完整,关键操作未全面覆盖
- 日志存储和备份策略不完善
- 缺乏有效的日志分析和异常检测机制
二、安全加固方案设计:四大核心模块构建
2.1 身份安全网关:构建多层次认证体系
2.1.1 问题分析与合规要求
| 原框架缺陷 | 合规要求 | 改造策略 |
|---|---|---|
| 密码策略简单,仅长度限制 | 等保三级要求密码复杂度包含大小写字母、数字及特殊符号 | 实现密码强度检测机制,强制密码定期更换 |
| JWT令牌有效期固定为2小时 | 等保三级要求会话超时不超过30分钟 | 实现令牌动态刷新机制,缩短有效期 |
| 单一密码认证 | 等保三级要求支持多因素认证 | 集成验证码、短信验证等多因素认证方式 |
2.1.2 技术实现方案
密码策略增强实现:
public class PasswordValidator {
// 密码复杂度校验
public static boolean validate(String password) {
// 密码长度至少8位
if (password.length() < 8) {
return false;
}
// 包含大小写字母、数字及特殊符号
boolean hasUpper = password.chars().anyMatch(Character::isUpperCase);
boolean hasLower = password.chars().anyMatch(Character::isLowerCase);
boolean hasDigit = password.chars().anyMatch(Character::isDigit);
boolean hasSpecial = password.chars().anyMatch(c -> "!@#$%^&*()_+{}[]|;:,.<>?`~".indexOf(c) != -1);
return hasUpper && hasLower && hasDigit && hasSpecial;
}
}
会话管理优化:
实现令牌动态刷新机制,当令牌即将过期时自动刷新,同时保持用户会话连续性。
public class TokenManager {
// 令牌过期时间设为30分钟
private static final long EXPIRATION_TIME = 30 * 60 * 1000;
// 提前5分钟刷新令牌
private static final long REFRESH_THRESHOLD = 5 * 60 * 1000;
public String refreshTokenIfNeeded(String token) {
if (isTokenExpiringSoon(token)) {
return generateNewToken(getUserId(token));
}
return token;
}
private boolean isTokenExpiringSoon(String token) {
Date expiration = getExpirationDate(token);
long timeLeft = expiration.getTime() - System.currentTimeMillis();
return timeLeft < REFRESH_THRESHOLD;
}
}
2.1.3 安全漏洞修复案例:某金融客户登录认证绕过事件
事件背景: 某金融客户反馈系统存在登录认证绕过风险,攻击者可通过修改JWT令牌中的用户ID字段,伪装成其他用户登录系统。
问题分析: 原框架中JWT令牌仅包含用户ID信息,未进行有效的签名验证,导致攻击者可篡改令牌内容。
修复方案:
- 增强JWT令牌签名机制,使用更安全的算法和密钥管理策略
- 在令牌中添加用户角色、权限等关键信息,实现端到端的身份验证
- 实现令牌黑名单机制,支持令牌的即时失效
验证步骤:
- 尝试修改JWT令牌中的用户ID字段,验证是否能成功登录
- 测试令牌过期和刷新机制是否正常工作
- 验证多因素认证功能是否有效
2.2 权限矩阵构建:实现精细化权限控制
2.2.1 问题分析与合规要求
| 原框架缺陷 | 合规要求 | 改造策略 |
|---|---|---|
| 权限粒度较粗,主要基于菜单 | 等保三级要求细粒度权限控制,覆盖到功能按钮 | 实现按钮级权限控制,为每个操作按钮配置独立权限标识 |
| 数据权限控制简单 | 等保三级要求实现数据分级访问控制 | 构建多维度数据权限矩阵,支持行级数据权限控制 |
| 缺乏权限继承机制 | 等保三级要求权限管理灵活可控 | 实现角色继承机制,支持权限的自动传递 |
2.2.2 技术实现方案
按钮级权限控制实现:
在前端实现权限控制指令,根据用户权限动态显示或隐藏操作按钮。
// 权限控制指令
Vue.directive('permission', {
inserted: function (el, binding) {
const permission = binding.value;
const userPermissions = store.getters.permissions;
if (!userPermissions.includes(permission)) {
el.parentNode.removeChild(el);
}
}
});
在后端实现权限注解,控制接口访问权限。
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequirePermission {
String value();
}
// AOP实现权限检查
@Aspect
@Component
public class PermissionAspect {
@Around("@annotation(requirePermission)")
public Object checkPermission(ProceedingJoinPoint joinPoint, RequirePermission requirePermission) throws Throwable {
String permission = requirePermission.value();
if (!SecurityUtils.hasPermission(permission)) {
throw new AccessDeniedException("无权限执行该操作");
}
return joinPoint.proceed();
}
}
数据权限矩阵实现:
设计灵活的数据权限控制模型,支持多种权限范围。
public class DataPermission {
// 数据权限类型:全部、部门、部门及子部门、个人
public enum Type { ALL, DEPARTMENT, DEPARTMENT_AND_CHILD, PERSONAL }
private Type type;
private List<Long> departmentIds;
// 根据权限类型生成数据过滤条件
public String generateSqlCondition() {
switch (type) {
case DEPARTMENT:
return "dept_id IN (" + StringUtils.join(departmentIds, ",") + ")";
case DEPARTMENT_AND_CHILD:
return "dept_id IN (SELECT id FROM sys_dept WHERE id IN (" + StringUtils.join(departmentIds, ",") + ") OR parent_id IN (" + StringUtils.join(departmentIds, ",") + "))";
case PERSONAL:
return "create_by = '" + SecurityUtils.getUsername() + "'";
default:
return "";
}
}
}
2.2.3 安全漏洞修复案例:某政府客户数据越权访问事件
事件背景: 某政府客户反映,低权限用户可以通过修改请求参数查看其他部门的数据,违反了数据隔离原则。
问题分析: 原系统仅在前端进行数据权限控制,未在后端实现有效的数据权限校验,导致恶意用户可通过构造请求绕过前端限制。
修复方案:
- 实现后端数据权限拦截器,在SQL执行前动态添加数据权限过滤条件
- 建立数据权限矩阵,根据用户角色和部门信息生成权限范围
- 对敏感操作添加二次确认机制,防止误操作和恶意操作
验证步骤:
- 使用低权限账号尝试访问其他部门数据,验证是否被拒绝
- 检查数据库查询日志,确认数据权限过滤条件是否正确添加
- 测试权限继承机制是否正常工作
2.3 数据防护体系:全生命周期数据安全保障
2.3.1 问题分析与合规要求
| 原框架缺陷 | 合规要求 | 改造策略 |
|---|---|---|
| 敏感数据明文传输 | 等保三级要求传输加密,防止数据泄露 | 全面启用HTTPS,实现传输层加密 |
| 敏感数据明文存储 | 等保三级要求敏感数据存储加密 | 实现敏感字段加密存储,支持透明加解密 |
| 缺乏数据脱敏机制 | 等保三级要求敏感信息脱敏展示 | 实现数据脱敏工具,对敏感信息进行脱敏处理 |
2.3.2 技术实现方案
传输加密实现:
配置SSL/TLS,强制所有HTTP通信通过HTTPS进行。
server:
port: 443
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: ${SSL_KEYSTORE_PASSWORD}
key-store-type: PKCS12
key-alias: server
protocol: TLSv1.2
ciphers: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
enabled-protocols: TLSv1.2
敏感数据加密存储实现:
实现基于AES的敏感数据加密工具类。
@Component
public class SensitiveDataEncryptor {
@Value("${encryption.key}")
private String key;
private final String ALGORITHM = "AES/GCM/NoPadding";
private final int GCM_IV_LENGTH = 12;
private final int GCM_TAG_LENGTH = 16;
public String encrypt(String data) {
try {
SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES");
byte[] iv = new byte[GCM_IV_LENGTH];
SecureRandom random = new SecureRandom();
random.nextBytes(iv);
Cipher cipher = Cipher.getInstance(ALGORITHM);
GCMParameterSpec parameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);
byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
// 组合IV和加密数据
ByteBuffer byteBuffer = ByteBuffer.allocate(iv.length + encryptedData.length);
byteBuffer.put(iv);
byteBuffer.put(encryptedData);
return Base64.getEncoder().encodeToString(byteBuffer.array());
} catch (Exception e) {
throw new EncryptionException("数据加密失败", e);
}
}
public String decrypt(String encryptedData) {
try {
SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES");
byte[] decodedData = Base64.getDecoder().decode(encryptedData);
// 分离IV和加密数据
ByteBuffer byteBuffer = ByteBuffer.wrap(decodedData);
byte[] iv = new byte[GCM_IV_LENGTH];
byteBuffer.get(iv);
byte[] cipherText = new byte[byteBuffer.remaining()];
byteBuffer.get(cipherText);
Cipher cipher = Cipher.getInstance(ALGORITHM);
GCMParameterSpec parameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);
cipher.init(Cipher.DECRYPT_MODE, secretKey, parameterSpec);
byte[] decryptedData = cipher.doFinal(cipherText);
return new String(decryptedData, StandardCharsets.UTF_8);
} catch (Exception e) {
throw new EncryptionException("数据解密失败", e);
}
}
}
数据脱敏实现:
实现灵活的数据脱敏工具类,支持多种脱敏策略。
public class DataMaskingUtils {
// 身份证号脱敏:显示前6位和后4位,中间用*代替
public static String maskIdCard(String idCard) {
if (StringUtils.isEmpty(idCard)) {
return "";
}
return idCard.replaceAll("(\\d{6})\\d{8}(\\d{4})", "$1********$2");
}
// 手机号脱敏:显示前3位和后4位,中间用*代替
public static String maskPhone(String phone) {
if (StringUtils.isEmpty(phone)) {
return "";
}
return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
}
// 邮箱脱敏:显示前3位和域名,中间用*代替
public static String maskEmail(String email) {
if (StringUtils.isEmpty(email)) {
return "";
}
return email.replaceAll("(\\w{3})\\w+@(\\w+\\.\\w+)", "$1***@$2");
}
}
2.3.3 安全漏洞修复案例:某电商平台用户信息泄露事件
事件背景: 某电商平台数据库被脱库,导致大量用户敏感信息泄露,包括身份证号、手机号等。
问题分析: 系统未对敏感数据进行加密存储,数据库明文存储用户敏感信息,导致数据库泄露后信息直接暴露。
修复方案:
- 使用AES-256算法对敏感字段进行加密存储
- 实现数据访问层的透明加解密,对应用层无感知
- 建立密钥轮换机制,定期更新加密密钥
验证步骤:
- 检查数据库中敏感字段是否已加密存储
- 测试数据查询和展示过程中是否正确解密和脱敏
- 验证密钥轮换机制是否正常工作
2.4 审计追踪系统:构建全面的安全审计体系
2.4.1 问题分析与合规要求
| 原框架缺陷 | 合规要求 | 改造策略 |
|---|---|---|
| 操作日志记录不完整 | 等保三级要求全面记录用户操作 | 实现全链路操作日志记录,覆盖所有关键操作 |
| 日志存储时间短 | 等保三级要求日志保存至少6个月 | 实现日志归档和备份机制,确保长期保存 |
| 缺乏日志分析能力 | 等保三级要求具备日志审计和异常检测能力 | 构建日志分析平台,实现异常行为检测 |
2.4.2 技术实现方案
全面操作日志实现:
设计统一的日志记录注解,自动记录方法调用信息。
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface OperateLog {
String module(); // 操作模块
String operation(); // 操作类型
boolean recordParams() default true; // 是否记录请求参数
boolean recordResult() default true; // 是否记录返回结果
}
// AOP实现日志记录
@Aspect
@Component
public class OperateLogAspect {
@Autowired
private OperateLogService operateLogService;
@Around("@annotation(operateLog)")
public Object recordLog(ProceedingJoinPoint joinPoint, OperateLog operateLog) throws Throwable {
OperateLogDTO logDTO = new OperateLogDTO();
logDTO.setModule(operateLog.module());
logDTO.setOperation(operateLog.operation());
logDTO.setOperator(SecurityUtils.getUsername());
logDTO.setOperateTime(new Date());
logDTO.setIp(IpUtils.getIpAddr());
// 记录请求参数
if (operateLog.recordParams()) {
logDTO.setParams(JSON.toJSONString(joinPoint.getArgs()));
}
long startTime = System.currentTimeMillis();
Object result;
try {
result = joinPoint.proceed();
logDTO.setStatus("success");
// 记录返回结果
if (operateLog.recordResult()) {
logDTO.setResult(JSON.toJSONString(result));
}
} catch (Exception e) {
logDTO.setStatus("fail");
logDTO.setErrorMsg(ExceptionUtils.getStackTrace(e));
throw e;
} finally {
logDTO.setCostTime(System.currentTimeMillis() - startTime);
// 异步保存日志
operateLogService.asyncSaveLog(logDTO);
}
return result;
}
}
日志存储与分析实现:
配置日志轮转和归档策略,确保日志长期保存。
<!-- logback.xml 配置 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/ruoyi.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天轮转 -->
<fileNamePattern>logs/ruoyi.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保留6个月日志 -->
<maxHistory>180</maxHistory>
<!-- 日志文件最大大小 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
实现日志分析工具,检测异常登录和操作行为。
@Service
public class LogAnalysisService {
@Autowired
private OperateLogMapper operateLogMapper;
// 检测异常登录行为
public List<AnomalyLoginDTO> detectAnomalyLogin() {
// 获取最近24小时登录日志
List<OperateLogDTO> loginLogs = operateLogMapper.getLoginLogsIn24Hours();
// 按用户分组分析
Map<String, List<OperateLogDTO>> userLogsMap = loginLogs.stream()
.collect(Collectors.groupingBy(OperateLogDTO::getOperator));
List<AnomalyLoginDTO> anomalies = new ArrayList<>();
for (Map.Entry<String, List<OperateLogDTO>> entry : userLogsMap.entrySet()) {
String username = entry.getKey();
List<OperateLogDTO> logs = entry.getValue();
// 检查登录IP是否异常(不同地区IP登录)
Set<String> regions = logs.stream()
.map(log -> IpUtils.getRegion(log.getIp()))
.collect(Collectors.toSet());
if (regions.size() > 3) { // 超过3个不同地区登录,视为异常
AnomalyLoginDTO anomaly = new AnomalyLoginDTO();
anomaly.setUsername(username);
anomaly.setAnomalyType("异地登录");
anomaly.setRegions(new ArrayList<>(regions));
anomaly.setLoginCount(logs.size());
anomalies.add(anomaly);
}
// 检查短时间内多次登录失败
List<OperateLogDTO> failedLogs = logs.stream()
.filter(log -> "fail".equals(log.getStatus()))
.sorted(Comparator.comparing(OperateLogDTO::getOperateTime))
.collect(Collectors.toList());
// 10分钟内5次以上登录失败
if (failedLogs.size() >= 5) {
for (int i = 4; i < failedLogs.size(); i++) {
Date firstTime = failedLogs.get(i-4).getOperateTime();
Date lastTime = failedLogs.get(i).getOperateTime();
long interval = (lastTime.getTime() - firstTime.getTime()) / (60 * 1000);
if (interval <= 10) {
AnomalyLoginDTO anomaly = new AnomalyLoginDTO();
anomaly.setUsername(username);
anomaly.setAnomalyType("暴力破解");
anomaly.setFailedCount(5);
anomaly.setTimeRange(interval + "分钟");
anomalies.add(anomaly);
break;
}
}
}
}
return anomalies;
}
}
2.4.3 安全漏洞修复案例:某企业内部数据泄露事件
事件背景: 某企业发生内部数据泄露事件,敏感数据被非法下载,但无法确定具体操作人。
问题分析: 系统日志记录不完整,未记录文件下载操作,且日志未包含详细的操作IP和时间信息,导致无法追溯泄露源头。
修复方案:
- 实现全面的操作日志记录,覆盖所有敏感操作
- 增强日志信息,包含操作IP、设备信息、操作时间等
- 实现日志实时监控和异常行为检测,及时发现可疑操作
验证步骤:
- 执行敏感操作,检查日志是否完整记录
- 测试异常行为检测功能,验证是否能正确识别可疑操作
- 检查日志归档和备份机制是否正常工作
三、实施验证:安全加固效果评估
3.1 自动化合规检查脚本
为确保安全加固措施的有效实施,开发自动化合规检查脚本,定期扫描系统配置和代码。
#!/bin/bash
# 安全合规检查脚本
echo "======= 安全合规检查开始 ======="
# 1. 检查HTTPS配置
echo "1. 检查HTTPS配置..."
if grep -q "server.ssl.enabled=true" application.yml; then
echo " ✅ HTTPS已启用"
else
echo " ❌ HTTPS未启用"
fi
# 2. 检查密码策略配置
echo "2. 检查密码策略配置..."
if grep -q "password.policy.complexity=high" application.yml; then
echo " ✅ 密码复杂度策略已配置"
else
echo " ❌ 密码复杂度策略未配置"
fi
# 3. 检查敏感数据加密配置
echo "3. 检查敏感数据加密配置..."
if grep -q "encryption.enabled=true" application.yml; then
echo " ✅ 敏感数据加密已启用"
else
echo " ❌ 敏感数据加密未启用"
fi
# 4. 检查日志配置
echo "4. 检查日志配置..."
if grep -q "log.retention.days=180" logback.xml; then
echo " ✅ 日志保留时间符合要求"
else
echo " ❌ 日志保留时间不足6个月"
fi
echo "======= 安全合规检查结束 ======="
3.2 安全基线扫描工具集成
集成开源安全扫描工具,定期对系统进行安全基线检查。
<!-- pom.xml 集成OWASP依赖检查插件 -->
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>7.1.0</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
<configuration>
<failOnCVSS>7</failOnCVSS>
<format>HTML</format>
<outputDirectory>${project.build.directory}/dependency-check-report</outputDirectory>
</configuration>
</plugin>
3.3 安全加固效果验证方法
3.3.1 身份认证安全验证
-
密码策略验证
- 尝试使用弱密码注册或修改密码,验证系统是否拒绝
- 测试密码过期机制,验证是否在过期前提醒用户更换密码
-
多因素认证验证
- 测试验证码功能,验证是否有效防止机器人登录
- 尝试使用错误验证码登录,验证系统是否拒绝
-
会话管理验证
- 测试令牌过期机制,验证过期后是否需要重新登录
- 尝试使用已过期的令牌访问系统,验证是否被拒绝
3.3.2 权限控制安全验证
-
功能权限验证
- 使用低权限账号尝试访问高权限功能,验证是否被拒绝
- 检查页面上是否只显示用户有权访问的功能按钮
-
数据权限验证
- 使用不同部门的账号登录,验证是否只能访问本部门数据
- 尝试通过修改请求参数访问其他部门数据,验证是否被拒绝
3.3.3 数据安全验证
-
传输加密验证
- 使用抓包工具检查所有HTTP通信是否都通过HTTPS进行
- 验证SSL证书是否有效,是否存在证书信任问题
-
存储加密验证
- 直接查看数据库,验证敏感字段是否加密存储
- 测试数据查询和展示功能,验证解密和脱敏是否正常
3.3.4 审计日志验证
-
日志完整性验证
- 执行关键操作,检查日志是否完整记录
- 验证日志是否包含操作人、时间、IP、操作内容等关键信息
-
日志分析验证
- 模拟异常登录行为,验证系统是否能检测并报警
- 测试日志查询功能,验证是否能按条件快速查询所需日志
四、总结与扩展资源
4.1 安全加固实施总结
通过本文介绍的"身份安全网关"、"权限矩阵构建"、"数据防护体系"和"审计追踪系统"四大模块的改造,可以显著提升RuoYi-Vue框架的安全性,满足等保三级等合规要求。实施过程中应注意以下几点:
- 循序渐进:先解决高危漏洞,再逐步完善安全措施
- 全面测试:每个安全措施实施后都需要进行充分测试
- 持续监控:建立安全监控机制,及时发现新的安全威胁
- 定期更新:安全措施需要根据新的威胁和合规要求定期更新
4.2 合规自查清单
| 检查项目 | 检查内容 | 合规要求 | 检查结果 |
|---|---|---|---|
| 身份认证 | 密码复杂度是否符合要求 | 至少8位,包含大小写字母、数字及特殊符号 | □ 符合 □ 不符合 |
| 身份认证 | 是否支持多因素认证 | 至少支持两种认证方式 | □ 符合 □ 不符合 |
| 身份认证 | 会话超时时间是否合理 | 不超过30分钟 | □ 符合 □ 不符合 |
| 权限控制 | 是否实现细粒度权限控制 | 功能按钮级权限控制 | □ 符合 □ 不符合 |
| 权限控制 | 是否实现数据权限分离 | 不同角色只能访问授权数据 | □ 符合 □ 不符合 |
| 数据保护 | 是否启用传输加密 | 所有通信使用HTTPS | □ 符合 □ 不符合 |
| 数据保护 | 敏感数据是否加密存储 | 身份证、手机号等敏感信息加密存储 | □ 符合 □ 不符合 |
| 数据保护 | 是否实现数据脱敏 | 敏感信息展示时脱敏处理 | □ 符合 □ 不符合 |
| 审计日志 | 日志是否完整记录 | 包含所有关键操作 | □ 符合 □ 不符合 |
| 审计日志 | 日志是否长期保存 | 至少保存6个月 | □ 符合 □ 不符合 |
| 安全管理 | 是否定期进行安全扫描 | 每月至少一次安全扫描 | □ 符合 □ 不符合 |
| 安全管理 | 是否建立安全事件响应机制 | 有明确的安全事件处理流程 | □ 符合 □ 不符合 |
4.3 第三方测评机构推荐
以下是一些权威的第三方等保测评机构,可根据实际需求选择:
-
中国信息安全测评中心
- 国家级权威测评机构,提供全面的等保测评服务
-
国家信息技术安全研究中心
- 专注于信息技术安全的国家级研究机构,提供专业的安全测评服务
-
中国网络安全审查技术与认证中心
- 提供信息安全产品认证、信息系统安全等级保护测评等服务
-
地方等保测评机构
- 各省市均有授权的等保测评机构,可通过当地公安部门获取推荐名单
4.4 版本适配说明
本文提供的安全加固方案适用于RuoYi-Vue 3.0及以上版本。对于旧版本,可能需要进行以下兼容性处理:
- 2.x版本:需要先升级到3.0版本,再应用本文的安全加固方案
- Vue2版本:前端权限控制指令需要调整为Vue2语法
- Spring Boot 2.0以下版本:部分安全配置类需要调整
建议在实施安全加固前,先将框架升级到最新稳定版本,以获得更好的兼容性和安全性。
通过本文提供的安全加固方案,RuoYi-Vue框架可以满足等保三级等合规要求,为企业级应用提供坚实的安全保障。安全是一个持续的过程,建议定期进行安全评估和加固,以应对不断变化的安全威胁。
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0229- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01- IinulaInula(发音为:[ˈɪnjʊlə])意为旋覆花,有生命力旺盛和根系深厚两大特点,寓意着为前端生态提供稳固的基石。openInula 是一款用于构建用户界面的 JavaScript 库,提供响应式 API 帮助开发者简单高效构建 web 页面,比传统虚拟 DOM 方式渲染效率提升30%以上,同时 openInula 提供与 React 保持一致的 API,并且提供5大常用功能丰富的核心组件。TypeScript05

