Scala:使用带有布尔方法的 jOOQ DSL
Posted
技术标签:
【中文标题】Scala:使用带有布尔方法的 jOOQ DSL【英文标题】:Scala: using jOOQ DSL with boolean methods 【发布时间】:2021-04-03 14:54:02 【问题描述】:我有这个 jOOQ 3.14.4、Scala 2.13 代码,其中混有一些已弃用的 Play
代码:
val user = Option(sql
.selectFrom(USER)
.where(USER.EMAIL.equal(email))
.and(USER.PASSWORD.equal(crypto.sign(password)))
.fetchOne())
请注意,email
和 password
是 String
s。
现在,我想用新的 Java 方法(我从 jBCrypt
库中获得)替换使用 Play
已弃用 Crypto
的代码:
public static boolean checkpw(String plaintext, String hashed)
1.如何在 jOOQ 代码中使用BCrypt.checkpw(...)
?
equal
不返回布尔值,如何提取 USER.PASSWORD TableField
中的实际字符串值?
BCrypt.checkpw
方法使用示例:
// Check that an unencrypted password matches one that has
// previously been hashed
if (BCrypt.checkpw(candidate, hashed))
System.out.println("It matches");
else
System.out.println("It does not match");
2。从密码学的角度来看,jBCrypt
是否被认为是安全的,用于加密密码以将其保存在生产数据库中?
【问题讨论】:
【参考方案1】:我不知道您的第二个问题的答案(我建议您在新问题中提出。这两个问题不相关)。这是您的第一个答案:
如何在 jOOQ 代码中使用 BCrypt.checkpw(...)?
使用此方法签名,您必须从数据库中获取散列密码,而不是使用 SQL 进行检查。您无法在数据库中执行 checkpw
后面的 Java 逻辑。因此,请改为:
val user = Option(sql
.selectFrom(USER)
.where(USER.EMAIL.equal(email))
.fetchOne())
.filter(u => BCrypt.checkpw(password, u.getPassword))
【讨论】:
太棒了!如果我必须使用BCrypt.checkpw
,似乎这就是我能做的。它认为您依赖于email
由单个用户使用的假设,否则它可能返回多个记录并且性能可能很差。我还研究了checkpw
的实际作用,它确实调用了哈希方法BCrypt.hashpw
,但不仅仅是检查hashpw(password, salt) == saved_password
(我不清楚为什么)。如果我只是比较保存的和新计算的哈希值,那么使用 jooq 我可以做到.and(USER.PASSWORD.equal(BCrypt.hashpw(password, BCrypt.gensalt())))
@rapt:我非常依赖电子邮件在用户中是唯一的假设,因为您在查询中也是如此,我无法想象一个系统,我也从未见过, 反之亦然,不过,我很想得到纠正。
你是对的,电子邮件在用户中是唯一的。这在这里很有用。 — 我的意思是,在其他情况下,当需要在对从数据库检索到的记录使用某种过滤算法之前执行 fetch
时,可能会检索到许多记录,而不仅仅是一条。很高兴这里不是这种情况。以上是关于Scala:使用带有布尔方法的 jOOQ DSL的主要内容,如果未能解决你的问题,请参考以下文章
带有 h2 和 jooq 的 JdbcSQLSyntaxErrorException