【问题标题】:How to connect to SQL Server using JDBC如何使用 JDBC 连接到 SQL Server
【发布时间】:2014-03-03 22:59:31
【问题描述】:

我正在使用 Microsoft SQL Server 2008 并尝试使用 JDBC 连接到数据库。下面是我的代码。用户名和密码使用Windows认证。

String url1 = "jdbc:sqlserver://ServerName;databaseName=v14testvp;user=USERNAME;password='';";
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    DriverManager.getConnection(url1);

我在尝试连接时遇到打击错误

com.microsoft.sqlserver.jdbc.SQLServerException:用户“USERNAME”登录失败。 ClientConnectionId:befb617f-8382-4388-ad98-a210ed0c3105

有人可以帮助我检查解决错误的方法吗?我尝试在我的 url1 字符串中填写用户名和密码,但我得到了同样的错误。我也尝试在用户名(域\用户名)中包含域。我对 sql 和 java 比较陌生,所以希望我只是缺少一些简单的东西。

编辑:

我将代码更改为以下

String url1 = "jdbc:sqlserver://servername;databaseName=v14testvp;integratedSecurity=true;authenticationScheme=JavaKerberos";
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        DriverManager.getConnection(url1);

我现在收到以下错误。我有 sqljdbc_auth.dll。有人可以为我指出如何解决这个问题的正确方向吗?

com.microsoft.sqlserver.jdbc.SQLServerException:集成身份验证失败。 ClientConnectionId:0e66f60e-958c-4c8e-85b9-484023f16ecf 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1667) 在 com.microsoft.sqlserver.jdbc.KerbAuthentication.intAuthInit(KerbAuthentication.java:140) 在 com.microsoft.sqlserver.jdbc.KerbAuthentication.GenerateClientContext(KerbAuthentication.java:268) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:2691) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:2234) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:41) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:2220) 在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1326) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:991) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827) 在 com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012) 在 java.sql.DriverManager.getConnection(未知来源) 在 java.sql.DriverManager.getConnection(未知来源) 在 com.ibm.atmn.tests.DumbyClass.DumbyTests(DumbyClass.java:52) 原因:javax.security.auth.login.LoginException:无法获取身份验证的主体名称

【问题讨论】:

  • com.microsoft.sqlserver.jdbc.SQLServerException:用户“用户名”登录失败。 1) 确保用户名/密码正确。 2)如果您是从远程机器访问,请确保远程访问被授予
  • @Nambari - 用户名/密码正确,并授予远程访问权限
  • @TestRaptor 你找到解决问题的方法了吗?

标签: java sql-server jdbc


【解决方案1】:

您不要将authenticationScheme=JavaKerberossqljdbc_auth.dll 一起使用。如果您有 DLL,则省略身份验证方案,您将以登录 Windows 的用户身份进行连接。

如果您想以其他用户身份连接或您不在 Windows 上,则可以指定 authenticationScheme=JavaKerberos。为此,您需要提供以下系统属性:

  • -Djava.security.auth.login.config=???
  • -Djava.security.krb5.conf=???

另见Oracles documentation about Kerberos Requirements

【讨论】:

    【解决方案2】:

    你必须设置 kerberos 相关的 java 属性

    1) loginContext 配置文件 默认情况下,微软为你配置,这是可选的。但如果你想控制更多的行为,你必须深入了解细节。 https://docs.oracle.com/javase/8/docs/jre/api/security/jaas/spec/com/sun/security/auth/module/Krb5LoginModule.html

    2) kerberos 配置 a)使用外部配置然后传递给java b) 直接使用java属性来设置 像 System.setProperty("java.security.krb5.realm", ""); System.setProperty("java.security.krb5.kdc",)

    【讨论】:

      【解决方案3】:

      当使用 Windows 身份验证连接到 SQL Server 时,您不能使用用户名和密码(参见例如 this answer)。相反,您需要指定integratedSecurity=true,并且根据驱动程序版本和偏好,您需要使用Kerberos 身份验证(并在连接字符串中包含authenticationScheme=JavaKerberos)或加载正确的sqljdbc_auth.dll

      Using Kerberos Integrated Authentication to Connect to SQL ServerBuilding the Connection URL

      【讨论】:

      • 谢谢。我编辑了我原来的问题。你能看看我的新错误吗?
      • 如果你想使用 sqlauth,那么你应该删除 authenticationScheme 属性或给它适当的值(参见我的答案中的第二个和第三个链接)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2014-12-01
      • 2012-12-04
      • 2015-09-27
      • 2014-01-02
      • 1970-01-01
      • 2011-01-27
      相关资源
      最近更新 更多