【发布时间】:2017-06-11 03:47:10
【问题描述】:
美好的一天,
我使用普通 JDBC 在 Java 中创建了一个 Web 应用程序
我有以下架构:
领域模型 - 服务层 - DAO 层
服务层是 CRUD 操作的中间人
我的用户类有字段“密码”(User.password)
我在数据库中的用户表有列“pass_hash”
我使用 spring.security 中的 BCrypt,因此不将盐存储为不同的列
问题:
- 我需要在域模型层中有哪些字段来处理密码?密码字段? passHash 字段?两个领域?其他想法?
- 阅读堆栈溢出后,我发现在创建用户实例时不包含 pass_hash,除非出于安全目的确实需要。问题是我应该省略哪一层 pass_hash: DAO?服务层? AFAIU DAO 层应该只负责数据库通信,所以我不会在那里制作额外的过滤器并使用 pass_hash 从 db 完全读取用户。然后我在服务层中将密码设置为空,如下面的读取方法所示。
- 哪一层应该包含散列:DAO/Service?我使用服务(下面的创建方法)
UserService 方法示例
@Override
public Long create(User user) {
String hashedPassword = BCrypt.hashpw(user.getPassword(),
BCrypt.gensalt(BCRYPT_SALT_LOG_ROUNDS));
user.setPassword(hashedPassword);
return userDao.create(user);
}
@Override
public User read(Long id) {
User user = userDao.read(id);
if (user != null) {
user.setPassword(null);
}
return user;
}
谢谢
【问题讨论】:
-
也许你可以很好地告诉我的问题出了什么问题,而不是在没有任何评论的情况下加上“-”
标签: java security passwords password-hash