我确实有一个用 Java 编写的自定义身份验证机制。我想知道在不重写 C 代码的情况下实现 Linux PAM 模块的最佳方法是什么?
我知道可用 PAM 模块的列表,但它们都不是与 Java 相关的。
还有JPam,但它做相反的事情:它允许获取要在 Java 应用程序中使用的用户/组信息,而我需要使用现有的 Java 代码来验证 Linux 中的用户(例如通过 SSH)。
欢迎任何建议。
我确实有一个用 Java 编写的自定义身份验证机制。我想知道在不重写 C 代码的情况下实现 Linux PAM 模块的最佳方法是什么?
我知道可用 PAM 模块的列表,但它们都不是与 Java 相关的。
还有JPam,但它做相反的事情:它允许获取要在 Java 应用程序中使用的用户/组信息,而我需要使用现有的 Java 代码来验证 Linux 中的用户(例如通过 SSH)。
欢迎任何建议。
你有没有想过使用pam_exec?
它允许您为 PAM 运行脚本。
例如,您将以下内容添加到您的 PAM 配置中:
auth sufficient pam_exec.so expose_authtok /usr/local/bin/myscript-example
这是一个简单的脚本,它回显所有的变量,但你可以很容易地让它启动一个 Java 程序,传入所需的变量。
根据脚本是否成功或错误输出应控制身份验证是否成功。
反映所有变量的示例脚本:
#!/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 $?
你可以试试:
但这些想法似乎都不理想。
编写一个 C 包装器来与 PAM 接口,并在实现中使用 JNI 调用 JVM 的实例。
当人们仍然希望交付真正在 JAR 中运行程序的“exe”时,JVM 启动包装器非常流行。您需要了解 JNI 通常不做的事情,即从二进制可执行文件调用 JVM;不幸的是,大多数 JNI 指令都专注于从 Java 调用 C 代码。
可以在此处找到如何从 C 代码创建 JVM 的一个很好的示例。将 C 代码模块转换为 PAM 共享对象库需要一些工作,但不会太难。
最后,不要忘记 JNI 的大部分操作都使用并返回 Java 类型。这意味着您必须先读取“C”数据类型(可能是 char*)并创建 Java 字符串,然后才能将它们传递到您的 JVM。反过来,从 Java 接收信息并将其传递回 PAM 库也是如此。
祝你好运!
http://jaas-pam.sourceforge.net/
它进行用户身份验证并与 Tomcat 的 jaas 领域一起使用,但不返回组/角色信息,因此没有基于角色的 Web 身份验证。
您实际上可以让 Java 与一个 C 存根对话,该存根又连接到 PAM 回调。阅读 JNI(Java 本机接口)。大多数情况下,JNI 用于将 C 暴露给 Java,但实际上您可以反过来做。您可能还想研究 GNU CNI,因为它实际上更方便使用。Wikipedia JNI page列出了很多资源