首页 文章

Java中的Linux PAM模块

提问于
浏览
3

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

我知道this list of available PAM modules但它们都不是Java相关的 .

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

欢迎任何建议 .

5 回答

  • 2

    编写一个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库也是如此 .

    祝好运!

  • 1

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

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

  • 0

    你有没有想过使用pam_exec?

    它允许您运行PAM的脚本 .

    例如您可以在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 $?
    
  • 0

    实际上,您可以让Java与C存根通信,而C存根又可以连接到PAM回调 . 阅读JNI(Java Native Interface) . 大多数情况下,JNI用于将C公开给Java,但实际上你可以用其他方式来做 . 您可能还想调查GNU CNI,因为它实际上更方便使用 . Wikipedia JNI page列出了很多资源

  • 2

    你可以尝试:

    • 使用GCJ将本程序编译为本机代码

    • 编写粘合C程序,嵌入JVM并加载Java代码

    但这些想法似乎都不合理 .

相关问题