首页 文章

tomcat中的JDBC Realm配置

提问于
浏览
1

我正在尝试配置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>

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

SEVERE:执行身份验证的异常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)位于org.apache.catali的org.apache.catalina.realm.JDBCRealm.getRoles(JDBCRealm.java:601)的com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:331) na.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)at 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)at 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)atg.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)org.apache.coyo te.http11.Http11Processor.service(Http11Processor.java:1110)atg.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)at org.apache.coyote.AbstractProtocol $ ConnectionHandler.process(AbstractProtocol.java:785) at org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1425)位于java.util.concurrent的org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)位于java的org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)的java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知来源)中的.ThreadPoolExecutor.runWorker(未知来源) . lang.Thread.run(Unknown Source)2017年9月21日12:00:59 PM org.apache.catalina.realm.JDBCRealm getRoles SEVERE:异常执行身份验证com.microsoft.sqlserver.jdbc.SQLServerException:关键字附近的语法不正确空值' . 在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)位于org.apache.catali的org.apache.catalina.realm.JDBCRealm.getRoles(JDBCRealm.java:601)的com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:331) na.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)at org.apache.coyote.AbstractProtocol $ ConnectionHandler.proces S(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)at java.lang.Thread.run(Unknown Source)

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

1 回答

  • 2

    您的问题似乎是您没有为用户分配角色的指定表 . 根据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"/>
    

    希望能帮助到你!

相关问题