我们遇到过类似的问题。我们的主要问题是使用 Windows UAC 时 GSS-API 实现失败,我们使用 Waffle 解决了它。
Waffle基本上是 JNA 调用 SSPI 的包装器。我们已经通过覆盖类成功地使用 Waffle 实现了 SSO sun.net.www.protocol.http.NegotiatorImpl
:
package sun.net.www.protocol.http;
import java.io.IOException;
import waffle.windows.auth.impl.WindowsSecurityContextImpl;
public class NegotiatorImpl extends Negotiator {
private String serviceName;
public NegotiatorImpl(HttpCallerInfo hci) throws IOException {
this.serviceName = "HTTP/" + hci.host.toLowerCase();
}
@Override
public byte[] firstToken() throws IOException {
return WindowsSecurityContextImpl.getCurrent("Negotiate", serviceName).getToken();
}
@Override
public byte[] nextToken(byte[] in) throws IOException {
return new byte[0];
}
}
然后,您可以创建一个仅包含此类的 JAR,并将其与 Waffle 和 JNA JAR 一起复制到 JVM 的./jre/lib/endorsed中。使用 JVM 的Java Endorsed Standards Override Mechanism,这替换了 JVM 的默认Negotiator
实现。