【发布时间】: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 过滤器或控制器中的密码状态和剩余天数(如果适用)。这并不难 - 最后必须完成相同的调用。
但这似乎不是解决问题的正确方法,因为它混合了责任。
那我还能做什么呢?
【问题讨论】: