Java中的Linux-PAM模块
我有一个用Java编写的自定义身份验证机制。我想知道在不重写C代码的情况下实现Linux PAM模块的最佳方法是什么 我知道,但没有一个与Java相关 还有一个问题,但它的作用正好相反:它允许获取Java应用程序中使用的用户/组信息,而我需要使用现有的Java代码在Linux中对用户进行身份验证(例如,通过SSH) 欢迎提出任何建议。您可以尝试:Java中的Linux-PAM模块,java,linux,authentication,pam,Java,Linux,Authentication,Pam,我有一个用Java编写的自定义身份验证机制。我想知道在不重写C代码的情况下实现Linux PAM模块的最佳方法是什么 我知道,但没有一个与Java相关 还有一个问题,但它的作用正好相反:它允许获取Java应用程序中使用的用户/组信息,而我需要使用现有的Java代码在Linux中对用户进行身份验证(例如,通过SSH) 欢迎提出任何建议。您可以尝试: 使用GCJ将Java程序编译为本机代码 编写嵌入JVM并加载Java代码的glue C程序 但是这两种想法似乎都不理想。编写一个C包装器与PAM接
- 使用GCJ将Java程序编译为本机代码
- 编写嵌入JVM并加载Java代码的glue C程序
但是这两种想法似乎都不理想。编写一个C包装器与PAM接口,并在实现中使用JNI调用JVM实例 JVM启动包装器非常流行,因为人们仍然希望交付真正在JAR中运行程序的“exe”。您将希望了解JNI通常不做的事情,即从二进制可执行文件调用JVM;不幸的是,大多数JNI指令侧重于从Java调用C代码 可以找到一个关于如何从C代码创建JVM的好例子。将C代码模块转换为PAM共享对象库需要做一些工作,但不太困难 最后,不要忘记,JNI为其大多数操作使用并返回Java类型。这意味着您必须读取“C”数据类型(可能是char*),并在将其传递到JVM之前创建Java字符串。从Java接收信息并将其传递回PAM库的情况与此相反
祝你好运 实际上,您可以让Java与C存根通信,而C存根又连接到PAM回调。阅读JNI(Java本机接口)。大多数情况下,JNI用于向Java公开C,但实际上您可以用另一种方式来实现。您可能还想调查GNU CNI,因为它实际上更方便使用。在
它进行用户身份验证,并与Tomcat的jaas领域一起工作,但不返回组/角色信息,因此没有基于角色的web身份验证。您想过使用 它允许您为PAM运行脚本 e、 g.在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 $?
谢谢忘了提到我的身份验证会进行数据库查找,并涉及大量其他JAR。看起来使用JNI将是一件痛苦的事情……您只需要使用不到100行的C来调用JVM。一旦在C程序中运行了JVM,就可以以一种非常正常的方式依赖类加载等。可能没有你想象的那么糟糕!我记得在2003年,我曾经历过很多痛苦,当时我想把Java和PHP4结合起来。这是为了通过“PHP中的Java支持”对Java API进行一些简单的PHP调用。我知道这里的情况不同,但我发誓我再也不会走同样的路了。正如我对另一个答案的评论,我宁愿编写一个C webservice客户端或类似的代码来实现这一点。但无论如何,非常感谢您-您的建议和链接可能对其他人查看此线程有用。好吧,祝您的库好运。顺便说一下,现在我们有了一个用Java实现的PHP解释器。我知道,对于一个不同的问题,一个解决方案太晚了,但也许它会让你笑一笑。第二个选择(glue C应用程序)总是“B计划”。我相信它应该很容易编写,比如说一个Web服务客户端,它的服务器端是用Java编写的,不是吗?