数据库安全实战 Java+MySQL实现企业文档权限管理系统
·

数据库安全设计
采用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}
更多推荐

所有评论(0)