2015-03-13 50 views
0

如果以前已经回答过很多次,那么表示歉意。到目前为止,我已经看到了很多“不,你不能这样做”的答案,但他们都已经至少5岁,所以我认为我会冒险的问题...在jdbc(&hibernate)中设置集成安全性的Windows凭据

我正在写一个java web(intranet)应用程序,它将连接到MS SQL Server(2012)数据库。在最初的开发中,我已经与SQL Server安全性以及集成安全性相关联,并且从db中读取和写入,因此我将继续前进。我们的数据库由dba团队维护,我们的.net应用程序设置了特定的Windows凭据,因此只有一个用户在数据库上设置。我认为他们更喜欢这个。我想知道是否可以从Java设置Windows凭据?因此,例如

jdbc.url = jdbc:sqlserver:// servername; database = dbname; integratedSecurity = true;

将连接为域\ appuser?

我想我可以使用活动目录组,因此它不是一个重要的问题,但我很好奇!

谢谢

回答

0

是的。您可以将凭据提供给SQL Server JDBC驱动程序。您也可以使用Web客户端的身份,这是我认为您真正想问的。这被称为“委托”,Kerberos协议支持这一点。

但是,您必须使用Kerberos和服务帐户(您的Web服务用于参与客户端的Kerberos身份验证的帐户)来验证Web客户端必须允许委派。然后,在认证过程中,您必须将委派的凭证存储在Kebreros凭证缓存中,以便当您尝试使用SQL Server JDBC驱动程序时,它可以查看它并将其用作连接标识。

但说实话,即使这似乎是一个优雅的方式来做到这一点,你可能不应该使用委派。不适用于HTTP应用程序。在实践中,Kerberos相当易变。而且我还没有意识到使用Java中的Kerberos验证Web客户端是一个非常好的包。他们在外面。但他们是黑客。内置于Java中的Kerberos实现不太好。例如,Kerberos很大程度上依赖于DNS,但内建的Java Kerberos只使用Java的DNS,它默认为主DNS,这意味着它的能力非常有限(无法查询不同的DNS服务器)。另外,如果您使用客户端标识连接到SQL Server,则您将创建并拆除大量昂贵的数据库连接。意味着它会很慢。它看起来可能会起作用,但如果你真的把它放在负载下,它会明显变慢。

所以我说的是,你应该真的只是使用一个身份连接到SQL Server。这是目前“行业最佳实践”。除非绝对需要,否则不要使用委派。

+0

谢谢。从广义上讲,我会在哪里提供证书?我是否在代码中设置了一个虚拟网络用户并使用它进行调用?或者它是连接上的一组属性还是连接字符串(connection.user,.domain,password等)中的一组属性 – gringogordo 2015-04-08 16:42:24