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())

请注意,emailpasswordStrings。

现在,我想用新的 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有jooq的普通sql中使用命名参数

带有 h2 和 jooq 的 JdbcSQLSyntaxErrorException

从 GCP 到本地的 Scala sql 查询远程访问错误

使用 JOOQ,为啥要在 insertInto().values() 中使用 DSL.param()?

jOOQ:如何查看已别名的字段?

无法在 Kotlin/Java 中使用 jooq DSL 执行 where 子句