数据库安全设计

采用MySQL的权限控制机制创建多级用户角色,包括管理员、部门主管和普通员工。为每个角色分配最小必要权限,管理员拥有完整CRUD权限,部门主管可管理本部门文档,普通员工仅限查看分配文档。

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL,
  `password_hash` VARCHAR(255) NOT NULL,
  `role` ENUM('admin','manager','staff') NOT NULL,
  `department_id` INT,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username_UNIQUE` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

数据加密存储

使用Java的Jasypt库实现敏感数据加密,对文档内容和用户密码采用AES-256加密算法。配置文件通过环境变量注入加密密钥,避免硬编码风险。

@Bean
public StringEncryptor stringEncryptor() {
    PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
    encryptor.setPoolSize(4);
    encryptor.setPassword(System.getenv("ENCRYPTION_KEY"));
    encryptor.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
    return encryptor;
}

权限验证框架

集成Spring Security实现RBAC模型,通过自定义注解控制方法级访问权限。采用JWT进行无状态认证,令牌包含用户角色和部门信息。

@PreAuthorize("hasRole('admin') || (hasRole('manager') && #doc.departmentId == authentication.departmentId)")
public Document updateDocument(Document doc) {
    return documentRepository.save(doc);
}

审计日志记录

建立完整的操作日志表记录所有数据变更,包括操作时间、用户ID、受影响文档ID和操作类型。通过MySQL触发器实现关键表的自动日志记录。

CREATE TABLE `audit_log` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `user_id` INT NOT NULL,
  `action` VARCHAR(20) NOT NULL,
  `document_id` INT,
  `timestamp` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `ip_address` VARCHAR(45),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

SQL注入防护

采用PreparedStatement处理所有数据库查询参数,使用MyBatis等ORM框架时严格禁用${}拼接SQL。对用户输入实施白名单验证和长度限制。

public List<Document> findByDepartment(int deptId) {
    String sql = "SELECT * FROM documents WHERE department_id = ? AND is_deleted = 0";
    return jdbcTemplate.query(sql, new Object[]{deptId}, new DocumentRowMapper());
}

传输层安全

配置HTTPS强制跳转,为MySQL启用SSL连接。文档下载接口实现临时签名URL机制,限制有效时间和访问次数。

# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/docdb?useSSL=true&requireSSL=true
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=${KEYSTORE_PASSWORD}

更多推荐