Java 在jdbc(&;hibernate)中设置集成安全性的windows凭据

Java 在jdbc(&;hibernate)中设置集成安全性的windows凭据,java,sql-server,jdbc,Java,Sql Server,Jdbc,如果之前已多次回答此问题,则表示歉意。到目前为止,我已经看到了很多“不,你不能这样做”的答案,但它们都已经至少5岁了,所以我想我应该大胆地提出这个问题 我正在编写一个java web(intranet)应用程序,它将连接到MS SQL Server(2012)数据库。在最初的开发中,我已经连接了SQL Server安全性和集成安全性,并从数据库进行了写和读操作,因此我将继续前进。不过,我们的数据库由dba团队维护,我们的.net应用程序设置了特定的windows凭据,以便在数据库上只设置一个用户

如果之前已多次回答此问题,则表示歉意。到目前为止,我已经看到了很多“不,你不能这样做”的答案,但它们都已经至少5岁了,所以我想我应该大胆地提出这个问题

我正在编写一个java web(intranet)应用程序,它将连接到MS SQL Server(2012)数据库。在最初的开发中,我已经连接了SQL Server安全性和集成安全性,并从数据库进行了写和读操作,因此我将继续前进。不过,我们的数据库由dba团队维护,我们的.net应用程序设置了特定的windows凭据,以便在数据库上只设置一个用户。我想他们更喜欢这个。我想知道是否可以从Java设置windows凭据?比如说

jdbc.url=jdbc:sqlserver://servername;数据库=dbname;integratedSecurity=true

是否将以域\应用程序用户身份连接

我想我可以使用active directory组来解决这个问题,所以这不是一个重要的问题,但我很好奇


谢谢

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

但是您必须使用Kerberos对web客户端进行身份验证,并且服务帐户(web服务用于参与客户端Kerberos身份验证的帐户)必须允许委派。然后,在身份验证期间,您必须将委派的凭据存储在Kebreros凭据缓存中,以便在尝试使用SQL Server JDBC驱动程序时,它可以看到它并将其用作连接标识

但老实说,尽管这似乎是一种优雅的方式,但您可能不应该使用委托。不适用于HTTP应用程序。实际上,Kerberos相当易变。我还不知道有什么真正好的包可以在Java中使用Kerberos对web客户机进行身份验证。他们在外面。但他们是黑客。Java中内置的Kerberos实现不是很好。例如,Kerberos严重依赖DNS,但内置Java Kerberos只使用Java的DNS,默认为主机DNS,这意味着它的能力非常有限(无法查询不同的DNS服务器)。此外,如果您使用客户机标识连接到SQL server,您将创建并拆除许多昂贵的数据库连接。这意味着它会很慢。它看起来可能会工作,但如果你真的把它放在负载下,它会明显地慢


所以我想说的是,您实际上应该只使用一个标识来连接到SQL Server。这是目前的“行业最佳实践”。除非绝对需要,否则不要使用委派。

谢谢。从广义上讲,我将在哪里提供凭证?我是在代码和调用中设置虚拟网络用户,还是在连接或连接字符串(connection.user、.domain、password等)中设置一组属性。