我有一个用Java编写的自定义身份验证机制。我想知道什么是执行一个Linux的PAM模块没有用C重写代码的最佳方式?
我知道this list of available PAM modules,但他们都不是与Java相关的。
还有JPam,但它确实相反的事情:它允许获得在Java应用程序时使用的用户/组的信息而我需要使用现有的Java代码来验证在Linux用户(例如,经由SSH)。
欢迎任何建议。
答案 0 :(得分:2)
你可以尝试:
但这些想法都不合理。
答案 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身份验证。