【问题标题】:Injected PasswordHash always throws null pointer when initializing with parameters使用参数初始化时,注入的 PasswordHash 总是抛出空指针
【发布时间】:2019-07-29 16:22:35
【问题描述】:

用参数初始化注入的PasswordHash实例时,总是抛出空指针异常。

在线使用几个不同的示例,我总是得到相同的结果。这是我遵循的最新示例:https://medium.com/@swhp/explore-hash-feature-on-java-ee-security-jsr-375-soteria-7fe3b1953785。 IDE 说注入的 Pbkd2PasswordHash 具有“不满足的依赖关系:没有 bean 与注入点匹配”。这是有道理的,因为它是一个接口,我没有使用该接口创建一个新类。但是,我在网上看到的所有示例都在没有实现它的情况下注入了这个类。

如果我实现 PasswordHash 或 PBkdf2PasswordHash 接口并覆盖方法,我可以避免空指针,但这违背了传递具有特定迭代、算法、盐大小和/或密钥大小值的参数的目的.

@Inject
Pbkdf2PasswordHash pbkdfHash;

@PostConstruct
public void init() {
    Map<String, String> parameters = new HashMap<>();

    parameters.put("Pbkdf2PasswordHash.Iterations", "3072");
    parameters.put("Pbkdf2PasswordHash.Algorithm", "PBKDF2WithHmacSHA512");
    parameters.put("Pbkdf2PasswordHash.KeySizeBytes", "64");
    parameters.put("Pbkdf2PasswordHash.SaltSizeBytes", "64");

    this.pbkdfHash.initialize(parameters);
}

我希望当我用参数初始化注入的 PasswordHash 时,实例会自动对传入的文本进行哈希处理。因为看起来我没有注入任何 bean 而我只是注入了一个接口,所以它只返回一个空指针实例已初始化。

【问题讨论】:

  • 根据你的标题,System.out.println(this.pbkdfHash.toString()) 工作......它不工作吗?实际上,您很可能在类路径上只有一个 api 而不是一个实现。因此,您要么没有在经过 java-ee8 认证的服务器上运行(例如 java-ee7 的服务器),要么正在运行 servlet 容器并且自己没有包含实现,或者有一些 beans.xml 配置错误或...
  • 不,它没有......所有接口都需要一个真正的实现才能有效地有用(你不能实例化一个接口)。我并不是说你应该实现接口,一点也不。但是您需要在类路径上实现 An
  • 快速浏览规范,似乎没有说实现必须为Pbkdf2PasswordHash 类型提供可注入的bean。这意味着它可以是特定于 impl 的。那些文章中提到的 Soteria,实际上将它作为一个 bean,从他们的代码 here 可以看出。而 Keycloak,作为另一个 impl,似乎有工厂,但没有 CDI bean,但我可能会遗漏一些东西。
  • 这是我的快速搜索给我的 Keycloak 工厂的link。但就像我说的,他们可能会在其他地方自动添加它......

标签: java jakarta-ee cdi


【解决方案1】:

Glassfish 和 Wildfly 提供了一个实现,即 Pbkdf2PasswordHashImpl。我需要添加 wildfly-ee-security 或 org.glassfish.soteria:javax.security.enterprise 来加入这个类。我怀疑我正在查看的示例是在没有显示 bean 的情况下自己实现 PasswordHash 接口。

感谢 Siliarus 提供 Soteria 实现的链接: https://github.com/javaee/security-soteria/blob/master/impl/src/main/java/org/glassfish/soteria/identitystores/hash/Pbkdf2PasswordHashImpl.java

我现在遇到了关于所需依赖项的构建错误,但这超出了这个问题的范围。如果你有兴趣,这里已经有一个未解决的问题: https://github.com/eclipse-ee4j/soteria/issues/193

【讨论】:

  • " 我怀疑我正在查看的示例是在没有显示 bean 的情况下自己实现 PasswordHash 接口。" 我严重怀疑这一点。它们很可能是在已经拥有它的应用服务器上运行...构建错误很可能是您混淆了 impls 的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 2013-09-07
  • 1970-01-01
  • 2013-07-10
  • 2020-09-03
  • 1970-01-01
相关资源
最近更新 更多