我从J2EE应用程序开始,基于表单的登录有一个恼人的错误。我无法找到任何解决方案,而且我真的不知道我还能做些什么。我决定在这里问一下你是否可以解决它:)。
我正在用eclipse编程,我有一个MySQL数据库,我正在使用eclipse提供的tomcat服务器。
当我运行应用程序时,服务器正常运行。如果我尝试进入任何安全区域(/ *),该应用程序会让我返回登录页面。如果我写错误的组合,程序会检测到错误,并向我发送消息。当我尝试使用正确的用户名和密码登录时,收到以下错误消息:
sep 24, 2015 1:13:27 PM org.apache.catalina.realm.JDBCRealm getRoles
GRAVE: Excepción al realizar la autentificación
**com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'username' in 'where clause'**
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:389)
at com.mysql.jdbc.Util.getInstance(Util.java:372)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3835)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3771)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2535)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1911)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2034)
at org.apache.catalina.realm.JDBCRealm.getRoles(JDBCRealm.java:632)
at org.apache.catalina.realm.JDBCRealm.authenticate(JDBCRealm.java:422)
at org.apache.catalina.realm.JDBCRealm.authenticate(JDBCRealm.java:353)
at org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:294)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:451)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
我在数据库中创建了以下表格:
- users , with 2 fields: username and password.
- user_roles, with 1 field: rolename.
- users_user_roles, with 2 fields: username and rolename.
我已将以下代码添加到web.xml文件中:
<login-config>
<auth-method>FORM</auth-method>
<realm-name>Example Form-Based Authentication Area</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/fail_login.jsp</form-error-page>
</form-login-config>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<description> accessible by authorised users </description>
<url-pattern>/*</url-pattern>
<http-method>DELETE</http-method>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>PUT</http-method>
</web-resource-collection>
<auth-constraint>
<description>These are the roles who have access</description>
<role-name>usuario</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
我已经更改了server.xml中的域代码,如下所示:
Realm className="org.apache.catalina.realm.JDBCRealm"
debug="99"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/apou_ddbb?user=apou&password=apouddbbpassword"
userTable="users" userNameCol="username" userCredCol="password"
userRoleTable="user_roles" roleNameCol="rolename"
我已遵循本指南:http://archive.oreilly.com/pub/a/onjava/2002/06/12/form.html
答案 0 :(得分:2)
这里有一些问题。
首先,JDBCRealm
可能不应该被使用:它是单线程的,如果您使用Web应用程序超越您和您的直系亲属,性能将会很糟糕。请改用DataSourceRealm
。这意味着您必须使用所有JDBC连接信息定义<Resource>
,然后将DataSourceRealm
链接到<Resource>
。这是一个更多的配置,但它更强大。
其次,userRoleTable
的表格错误:您需要users_user_roles
而不是user_roles
。您的user_roles
表仅包含可能的角色列表 - 而不是用户与角色的实际映射。我可能会建议将user_roles
重新命名为roles
,并将users_user_roles
重新命名为user_roles
以避免混淆:替换表名称roles
表明它具有与用户无关,这可以说是事实。
Tomcat用户指南中对此进行了介绍,该指南分布在多个文档中: