【问题标题】:Java JAAS integration with Linux PAM including password agingJava JAAS 与 Linux PAM 的集成,包括密码老化
【发布时间】:2015-12-10 08:10:08
【问题描述】:

背景

在我们的项目中,我们正在使用自定义的LoginModule 实现将 Web 应用程序的 JAAS 与服务器的 Linux PAM 集成。我知道有项目为 JAAS 实施 PAM,但这不是重点,尤其是它们不能解决我的问题。

现在要求正确处理密码老化和影子状态。

因此,尝试使用以下密码登录(使用 Web 表单)的用户:

  • 过期应该被拒绝访问并收到一条消息要求联系管理员更新帐户,
  • inactive 应该被拒绝访问并收到一条消息,要求使用 SSH 更改他的密码,
  • 在警告期内应该被授予访问权限,但会收到一条消息,告知在密码必须更改之前还有多少天。

这些是 PAM 的正常行为,例如 SSH。 (但请注意,这取决于 PAM 配置和帐户设置。)

问题

我可以在我们的自定义LoginModule 中轻松获取所需信息。所以我会知道状态(过期、非活动、警告......)和剩余天数(如果适用)。

但是如何进一步传播呢?

可以通过仔细挑选LoginModule 实现中抛出的异常来区分过期/非活动状态。这并不完美,因为如果某个中间层消耗异常来重新抛出其他东西,我将再次遇到麻烦。但我想这是可行的。

但是警告期呢?异常是没有办法的,因为它是成功登录。但是我仍然需要提供此密码处于警告期以及剩余天数的额外信息。

我看到的LoginModule 之外的唯一通信方式是向Subject 添加一些内容。但我要补充的似乎既不是Principal,也不是凭证。

当然,我可以将我的自定义对象作为凭据或自定义 Principal 实现推送。但这似乎并不“自然”。它看起来更像是破坏设计。我什至没有找到任何人这样做的例子。

那我该怎么做呢?通过LoginModule账户的附加信息进行交流的方式是什么?

解决方法

至于现在我想出了一个解决方法。我可以在 PAM/NSS 上进行必要的查询,以确定 servlet 过滤器或控制器中的密码状态和剩余天数(如果适用)。这并不难 - 最后必须完成相同的调用。

但这似乎不是解决问题的正确方法,因为它混合了责任。

那我还能做什么呢?

【问题讨论】:

    标签: java jaas pam


    【解决方案1】:

    我想我理解您想要实现的目标,但处理密码状态不是LoginModule 的责任,也不是JAAS 的设计目的。

    因此,我认为您的解决方法是可行的方法。如果您很容易在LoginModule 中获取其他信息,那么在此处创建一个字段或传递一个对象,您将在其中存储该数据并在需要将其呈现给用户时访问它。 - 亲吻

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2019-07-03
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      相关资源
      最近更新 更多