我正在尝试配置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 回答
您的问题似乎是您没有为用户分配角色的指定表 . 根据Tomcat documentation关于JDBC领域:
异常堆栈也证实了这种猜测
因此,要克服此类问题,您应该指定角色表
userRoleTable
和角色名称列roleNameCol
,如下所示:希望能帮助到你!