3

我确实有一个用 Java 编写的自定义身份验证机制。我想知道在不重写 C 代码的情况下实现 Linux PAM 模块的最佳方法是什么?

我知道可用 PAM 模块的列表,但它们都不是与 Java 相关的。

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

欢迎任何建议。

4

5 回答 5

3

你有没有想过使用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 $?
于 2016-10-03T12:52:02.787 回答
2

你可以试试:

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

但这些想法似乎都不理想。

于 2010-06-29T21:16:24.073 回答
1

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

当人们仍然希望交付真正在 JAR 中运行程序的“exe”时,JVM 启动包装器非常流行。您需要了解 JNI 通常不做的事情,即从二进制可执行文件调用 JVM;不幸的是,大多数 JNI 指令都专注于从 Java 调用 C 代码。

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

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

祝你好运!

于 2010-06-29T21:19:10.003 回答
0

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

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

于 2014-04-01T10:59:46.167 回答
0

您实际上可以让 Java 与一个 C 存根对话,该存根又连接到 PAM 回调。阅读 JNI(Java 本机接口)。大多数情况下,JNI 用于将 C 暴露给 Java,但实际上您可以反过来做。您可能还想研究 GNU CNI,因为它实际上更方便使用。Wikipedia JNI page列出了很多资源

于 2010-06-29T21:24:55.350 回答