Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的Linux-PAM模块_Java_Linux_Authentication_Pam - Fatal编程技术网

Java中的Linux-PAM模块

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接

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

我知道,但没有一个与Java相关

还有一个问题,但它的作用正好相反:它允许获取Java应用程序中使用的用户/组信息,而我需要使用现有的Java代码在Linux中对用户进行身份验证(例如,通过SSH)

欢迎提出任何建议。

您可以尝试:

  • 使用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编写的,不是吗?