Scala:使用带有布尔方法的 jOOQ DSL

问题描述

我有这个 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())

请注意,emailpasswordString

现在,我想用新的 Java 方法(我从 Play 库中获得)替换使用 Crypto 已弃用的 jBCrypt代码

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