基于J2EE表单的登录错误

时间:2015-09-24 11:41:04

标签: mysql tomcat java-ee login realm

我从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&amp;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

1 个答案:

答案 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用户指南中对此进行了介绍,该指南分布在多个文档中: