Java中的Linux PAM模块

时间:2010-06-29 21:10:39

标签: java linux authentication pam

我有一个用Java编写的自定义身份验证机制。我想知道什么是执行一个Linux的PAM模块没有用C重写代码的最佳方式?

我知道this list of available PAM modules,但他们都不是与Java相关的。

还有JPam,但它确实相反的事情:它允许获得在Java应用程序时使用的用户/组的信息而我需要使用现有的Java代码来验证在Linux用户(例如,经由SSH)。

欢迎任何建议。

5 个答案:

答案 0 :(得分:2)

你可以尝试:

  • 使用GCJ将本程序编译为本机代码
  • 编写嵌入JVM并加载Java代码的胶水C程序

但这些想法都不合理。

答案 1 :(得分:2)

您是否考虑过使用pam_exec?

它允许您运行PAM的脚本。

e.g。您可以在PAM配置中添加以下内容:

auth sufficient pam_exec.so expose_authtok /usr/local/bin/myscript-example

这是一个简单的脚本,它可以响应所有变量,但你可以轻松地启动Java程序,传递所需的变量。

根据脚本是成功还是出错来控制auth是否成功。

反映所有变量的示例脚本:

#!/bin/sh
read password
echo "User: $PAM_USER"
echo "Ruser: $PAM_RUSER"
echo "Rhost: $PAM_RHOST"
echo "Service: $PAM_SERVICE"
echo "TTY: $PAM_TTY"
echo "Password : $password"
exit $?

答案 2 :(得分:1)

将C包装器写入与PAM的接口,并在实现中使用JNI来调用JVM的实例。

当人们仍然希望提供真正在JAR中运行程序的“exe”时,JVM启动包装器非常受欢迎。您将要查看JNI通常无法完成的操作,从二进制可执行文件调用JVM;不幸的是,大多数JNI指令都专注于从Java调用C代码。

可以找到如何从C代码创建JVM的一个很好的示例here。将C代码模块转换为PAM共享对象库需要一些工作,但这不太可能太难。

最后,不要忘记JNI使用并返回大多数操作的Java类型。这意味着您必须先读取“C”数据类型(可能是char *)并在将它们传递到JVM之前创建Java字符串。反过来,从Java接收信息并将其传递回PAM库也是如此。

祝你好运!

答案 3 :(得分:0)

实际上,您可以让Java与C存根通信,而C存根又可以连接到PAM回调。阅读JNI(Java Native Interface)。大多数情况下,JNI用于将C公开给Java,但实际上你可以用其他方式来做。您可能还想调查GNU CNI,因为它实际上更方便使用。 Wikipedia JNI page

列出了很多资源

答案 4 :(得分:0)

http://jaas-pam.sourceforge.net/

它执行用户身份验证并与Tomcat的jaas域一起使用,但不返回任何组/角色信息,因此没有基于角色的Web身份验证。