使用Kerberos S4U扩展(在Java 8中引入)使用JDBC连接到数据库

我用Java编写代码已经有一段时间了,所以我可能会遗漏一些明显的东西。 我想通过JDBC连接到数据库(我需要支持很多 – SQL Server,MySQL等)。 但是,我想使用Java 8中添加的Microsoft S4U Java扩展支持来实现Kerberos委派。 我不希望用户必须在我的中间层服务器上输入他们的凭据。 我想使用S4U代表用户获取我的中间层服务器的票证,并使用它通过doAs函数(Subject.doAs或doAsPrivileged)调用JDBC代码。

我已经在Windows上使用C ++和ODBC添加了对协议转换和约束委派的支持。 但我不知道如何用Java做同样的事情。 关于Java的S4U文档很稀疏。 此页面似乎包含最多信息 – http://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/jgss-features.html 。 该页面说“已经在com.sun.security.jgss包中添加了一个新的公共方法(GSSCredential :: impersonate)来实现这些扩展。” 基于http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/single-signon.html ,我认为我需要使用类LoginContext和Subject来调用doAs JDBC连接调用,以便在Subject的凭据下进行连接。 但是我如何在混合中使用GSSCredential :: impersonate?

谢谢,艾德

这是我在网上进行大量搜索后得到的代码:

GSSManager manager = GSSManager.getInstance(); GSSCredential self = manager.createCredential(GSSCredential.INITIATE_ONLY); GSSName user = manager.createName("myuser", GSSName.NT_USER_NAME); GSSCredential impCred = ((ExtendedGSSCredential)self).impersonate(user); Subject mySubject = new Subject(); mySubject.getPrivateCredentials().add(impCred); PrivilegedAction action = new ClientAction(); Subject.doAs(mySubject, action); 

我现在得到“GSSException:在GSS-API级别未指定失败(机制级别:尝试获取S4U2self凭据失败!)”在模拟调用上,我仍在调查。