客户端请求实现一个简单的类似SSO的NTLM验证器。因此,我需要找到一种方法来验证当尝试连接到服务器时,哪个用户登录了。
在使用JavaScript时,我花了大约5分钟使用这个包:https://www.npmjs.com/package/express-ntlm
您可以为包定义LDAP服务器,NTLM协商将导致"DomainName“、"UserName”、"Workstation“和"Authenticated”值。我已经成功地实现了。
有没有库或其他原生方法可以让Java像NodeJS-Server一样简单地完成这项工作?
我找到的一些解决方案需要凭据,而我没有或不想提供凭据。JavaScript解决方案只在提供了LDAP Server的情况下运行,所以我非常确定我不需要它们。
发布于 2018-06-07 05:47:55
你的问题对我来说不是完全清楚,但我会尝试回答本机部分,并在同一时间增强这个answer,或多或少关于相同的主题。
从JDK7开始,我们可以看到以下com.sun.security.ntlm本机包
$ unzip -l 1.7/jre/lib/rt.jar | grep -i ntlm
4243 2015-04-10 19:56 com/sun/security/ntlm/Client.class
1568 2015-04-10 19:56 com/sun/security/ntlm/NTLM$Reader.class
1831 2015-04-10 19:56 com/sun/security/ntlm/NTLM$Writer.class
6486 2015-04-10 19:56 com/sun/security/ntlm/NTLM.class
617 2015-04-10 19:56 com/sun/security/ntlm/NTLMException.class
3763 2015-04-10 19:58 com/sun/security/ntlm/Server.class
939 2015-04-10 19:56 com/sun/security/ntlm/Version.class
... ...不幸的是,这个包并不打算直接使用,正如Oracle JDK-6982971 bug中所解释的那样:
com.sun.security.ntlm包和包中的类不会以NON_CORE_PKGS的形式公开,并且对javac不可见。
在此基础上,本机解决方案依赖于以下变通方法:使用可以从here下载的所有com.sun.security.ntlm源文件编译代码,例如Client.java、NTLM.java、..Server.verify方法使您可以访问您在问题中提到的参数。请注意,此调试属性可以帮助您(-Dntlm.debug)。
在这个实现中,要知道它在JDK1.7之前不会编译,因为有一个对String in switch Statement调用,尽管您可以很容易地向后移植到更早的Java版本。
我建议使用可用的最新源代码,因为在(例如Java7) Support Release Notes中很难跟踪错误。在撰写本文时,据我所知,OpenJDK JDK-7150092 bug中列出了要使用的当前版本。
到目前为止,我还没有使用这种方法编写任何服务器代码,但只编写了大约100行的HTTP客户机,这演示了这种技术。要知道的最后一件事是,我所讨论的本机类不是多线程的。
https://stackoverflow.com/questions/50678314
复制相似问题