为 jdbc(& 休眠)中的集成安全性设置 windows 凭据
Setting windows credentials for integrated security in jdbc (& hibernate)
如果这个问题之前已经回答过很多次,我们深表歉意。到目前为止,我已经看到了很多 "no you can't do this" 个答案,但它们都至少有 5 年历史了,所以我想我会冒险问这个问题...
我正在编写一个 java 网络(内联网)应用程序,它将连接到 MS SQL 服务器 (2012) 数据库。在最初的开发中,我已经连接了 SQL 服务器安全性以及集成安全性,并从数据库中写入和读取,所以我将继续前进。我们的数据库由 dba 团队维护,我们的 .net 应用程序设置了特定的 windows 凭据,以便在数据库上只设置一个用户。我认为他们更喜欢这个。我想知道是否可以从 Java 设置 windows 凭据?例如
jdbc.url=jdbc:sqlserver://servername;database=dbname;integratedSecurity=true;
会连接为 domain\appuser ?
我想我可以为此使用活动目录组,所以这不是一个重要问题,但我很好奇!
谢谢
是的。您可以向 SQL 服务器 JDBC 驱动程序提供凭据。您还可以使用网络客户端的身份,这是我认为您真正要问的。这称为 "delegation",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 服务器,您将创建和拆除大量昂贵的数据库连接。这意味着它会很慢。它可能看起来可以工作,但如果你真的把它放在负载下,它会明显变慢。
所以我的意思是你真的应该只使用一个身份连接到 SQL 服务器。这是此时的"industry best practice"。除非绝对需要,否则不要使用委派。
如果这个问题之前已经回答过很多次,我们深表歉意。到目前为止,我已经看到了很多 "no you can't do this" 个答案,但它们都至少有 5 年历史了,所以我想我会冒险问这个问题...
我正在编写一个 java 网络(内联网)应用程序,它将连接到 MS SQL 服务器 (2012) 数据库。在最初的开发中,我已经连接了 SQL 服务器安全性以及集成安全性,并从数据库中写入和读取,所以我将继续前进。我们的数据库由 dba 团队维护,我们的 .net 应用程序设置了特定的 windows 凭据,以便在数据库上只设置一个用户。我认为他们更喜欢这个。我想知道是否可以从 Java 设置 windows 凭据?例如
jdbc.url=jdbc:sqlserver://servername;database=dbname;integratedSecurity=true;
会连接为 domain\appuser ?
我想我可以为此使用活动目录组,所以这不是一个重要问题,但我很好奇!
谢谢
是的。您可以向 SQL 服务器 JDBC 驱动程序提供凭据。您还可以使用网络客户端的身份,这是我认为您真正要问的。这称为 "delegation",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 服务器,您将创建和拆除大量昂贵的数据库连接。这意味着它会很慢。它可能看起来可以工作,但如果你真的把它放在负载下,它会明显变慢。
所以我的意思是你真的应该只使用一个身份连接到 SQL 服务器。这是此时的"industry best practice"。除非绝对需要,否则不要使用委派。