有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java JAAS与Linux PAM的集成,包括密码老化

背景

在我们的项目中,我们使用定制的LoginModule实现将web应用程序的JAAS与服务器的Linux PAM集成。我知道有一些项目实现了PAM for JAAS,但这不是重点,尤其是它们不能解决我的问题

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

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

  • 过期的应被拒绝访问,并收到一条消息,要求与管理员联系以续订帐户
  • inactive应被拒绝访问,并收到一条消息,要求使用SSH更改其密码
  • 在警告期内,应被授予访问权限,但会收到一条消息,通知在密码更改前还剩多少天

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

问题

我可以在我们的定制LoginModule中轻松获得所需信息。所以我会知道状态(过期、不活动、警告等)以及剩余天数(如适用)

但如何进一步传播呢

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

但是警告期呢?异常是不可能的,因为它是成功登录的。但我仍然需要提供额外的信息,这个密码处于警告期,还有多少天

我所看到的LoginModule之外的唯一沟通方式是在Subject中添加一些东西。但我要补充的似乎既不是Principal也不是凭证

当然,我可以将自定义对象作为凭证或自定义Principal实现来推送。但这似乎并不“自然”。看起来更像是打破了设计。我甚至没有发现任何人做这种事的例子

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

解决方法

至于现在,我想出了一个解决办法。我可以在PAM/NSS上执行所需的查询,以确定密码状态以及servlet过滤器或控制器中剩余的天数(如果适用)。这甚至不是更困难的事情——最终也必须完成同样的任务

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

那我还能做什么呢


共 (0) 个答案