【问题标题】:JDBC Realm configuration in tomcatTomcat 中的 JDBC Realm 配置
【发布时间】:2023-04-09 17:43:01
【问题描述】:

我正在尝试配置 tomcat 以使用 SQL Server 进行身份验证。我修改了server.xml 如下:

<Realm className="org.apache.catalina.realm.LockOutRealm">
    <!-- This Realm uses the UserDatabase configured in the global JNDI
         resources under the key "UserDatabase".  Any edits
         that are performed against this UserDatabase are immediately
         available for use by the Realm.  -->
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> 

    <!--This is only applicable for Tomcat 8.5 and higher version with SQL server authentication-->
        <Realm className="org.apache.catalina.realm.JDBCRealm"
          driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
    connectionURL="jdbc:sqlserver://xxx.xx.xxx.xxx:1433;databaseName=xxxx" connectionName="user" connectionPassword="password"  userTable="xx" userNameCol="username" userCredCol="password"/>
</Realm>

但是,每次我尝试进行身份验证时都会收到以下错误:

严重:执行身份验证时出现异常 com.microsoft.sqlserver.jdbc.SQLServerException:关键字“null”附近的语法不正确。 在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:258) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1535) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:467) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:409) 在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7151) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2478) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:219) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:199) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:331) 在 org.apache.catalina.realm.JDBCRealm.getRoles(JDBCRealm.java:601) 在 org.apache.catalina.realm.JDBCRealm.authenticate(JDBCRealm.java:404) 在 org.apache.catalina.realm.JDBCRealm.authenticate(JDBCRealm.java:326) 在 org.apache.catalina.realm.CombinedRealm.authenticate(CombinedRealm.java:193) 在 org.apache.catalina.realm.LockOutRealm.authenticate(LockOutRealm.java:158) 在 org.apache.catalina.authenticator.BasicAuthenticator.authenticate(BasicAuthenticator.java:84) 在 org.apache.catalina.authenticator.AuthenticatorBase.authenticate(AuthenticatorBase.java:700) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:599) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Unknown Source)

2017 年 9 月 21 日下午 12:00:59 org.apache.catalina.realm.JDBCRealm getRoles 严重:执行身份验证的异常 com.microsoft.sqlserver.jdbc.SQLServerException:关键字“null”附近的语法不正确。 在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:258) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1535) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:467) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:409) 在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7151) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2478) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:219) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:199) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:331) 在 org.apache.catalina.realm.JDBCRealm.getRoles(JDBCRealm.java:601) 在 org.apache.catalina.realm.JDBCRealm.authenticate(JDBCRealm.java:404) 在 org.apache.catalina.realm.JDBCRealm.authenticate(JDBCRealm.java:326) 在 org.apache.catalina.realm.CombinedRealm.authenticate(CombinedRealm.java:193) 在 org.apache.catalina.realm.LockOutRealm.authenticate(LockOutRealm.java:158) 在 org.apache.catalina.authenticator.BasicAuthenticator.authenticate(BasicAuthenticator.java:84) 在 org.apache.catalina.authenticator.AuthenticatorBase.authenticate(AuthenticatorBase.java:700) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:599) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Unknown Source)

我已将mssql-jdbc-6.2.1.jre8.jar 放入lib 文件夹中。

【问题讨论】:

    标签: java sql-server tomcat jdbc jdbcrealm


    【解决方案1】:

    您的问题似乎是您没有指定的表以及分配给用户的角色。根据 Tomcat documentation 关于 JDBC 领域:

    • 必须有一个表,下面称为用户角色表,其中包含分配给特定用户的每个有效角色的一行。用户拥有零个、一个或多个有效角色是合法的。
    • 用户角色表必须至少包含两列(如果您的现有应用程序需要,它可能包含更多列):
      • Tomcat 可识别的用户名(与 users 表中指定的值相同)。
      • 与此用户关联的有效角色的角色名称

    异常堆栈也证实了这样的猜测

    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:331)
    at org.apache.catalina.realm.JDBCRealm.getRoles(JDBCRealm.java:601)
    at org.apache.catalina.realm.JDBCRealm.authenticate(JDBCRealm.java:404)
    

    因此,要克服此类问题,您应该像这样指定角色表userRoleTable 和角色名称列roleNameCol

    <Realm className="org.apache.catalina.realm.JDBCRealm"
           driverName="org.gjt.mm.mysql.Driver"
           connectionURL="jdbc:mysql://localhost/authority?user=dbuser&amp;
           password=dbpass"
           userTable="users" userNameCol="user_name" userCredCol="user_pass"
           userRoleTable="user_roles" roleNameCol="role_name"/>
    

    希望对你有帮助!

    【讨论】:

    • 嗨 Sergey,在指定角色表详细信息后,它会登录到应用程序,但我收到以下错误:HTTP Status 403 - Access to the requested resource has been denied 尽管它适用于具有相同用户和角色凭据的 mysql
    • @HBK,我不知道您在应用程序中使用的安全性(甚至是应用程序本身),所以最有可能的问题是您对资源应用了一些安全限制,而这样的用户没有'没有允许的角色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2015-08-12
    • 1970-01-01
    • 2011-02-27
    • 2014-07-07
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多