我有一个用Java编写的自定义身份验证机制 . 我想知道在不重写C代码的情况下实现Linux PAM模块的最佳方法是什么?
我知道this list of available PAM modules但它们都不是Java相关的 .
还有JPam但它做了相反的事情:它允许在Java应用程序中使用用户/组信息,而我需要使用现有的Java代码来验证Linux中的用户(例如通过SSH) .
欢迎任何建议 .
我有一个用Java编写的自定义身份验证机制 . 我想知道在不重写C代码的情况下实现Linux PAM模块的最佳方法是什么?
我知道this list of available PAM modules但它们都不是Java相关的 .
还有JPam但它做了相反的事情:它允许在Java应用程序中使用用户/组信息,而我需要使用现有的Java代码来验证Linux中的用户(例如通过SSH) .
欢迎任何建议 .
5 回答
编写一个C包装器与PAM接口,并在实现中,使用JNI来调用JVM的一个实例 .
当人们仍然希望提供真正在JAR中运行程序的“exe”时,JVM启动包装器非常受欢迎 . 您将要查看JNI通常无法完成的操作,从二进制可执行文件调用JVM;不幸的是,大多数JNI指令都专注于从Java调用C代码 .
可以在here找到如何从C代码创建JVM的一个很好的示例 . 将C代码模块转换为PAM共享对象库将需要一些工作,但它不太可能太难 .
最后,不要忘记JNI使用并返回大多数操作的Java类型 . 这意味着您必须先读取“C”数据类型(可能是char *)并在将它们传递到JVM之前创建Java字符串 . 反过来从Java接收信息并将其传递回PAM库也是如此 .
祝好运!
http://jaas-pam.sourceforge.net/
它执行用户身份验证并与Tomcat的jaas域一起使用,但不返回组/角色信息,因此没有基于角色的Web身份验证 .
你有没有想过使用pam_exec?
它允许您运行PAM的脚本 .
例如您可以在PAM配置中添加以下内容:
这是一个简单的脚本,它回应了所有的变量,但是你可以轻松地启动Java程序,传递所需的变量 .
根据脚本是否成功或错误输出应控制auth是否成功 .
示例脚本以反映所有变量:
实际上,您可以让Java与C存根通信,而C存根又可以连接到PAM回调 . 阅读JNI(Java Native Interface) . 大多数情况下,JNI用于将C公开给Java,但实际上你可以用其他方式来做 . 您可能还想调查GNU CNI,因为它实际上更方便使用 . Wikipedia JNI page列出了很多资源
你可以尝试:
使用GCJ将本程序编译为本机代码
编写粘合C程序,嵌入JVM并加载Java代码
但这些想法似乎都不合理 .