对于webapp testapp,其web.xml中具有以下内容(除其他外)
testapp
<security-constraint> <web-resource-collection> <web-resource-name>My JSP</web-resource-name> <url-pattern>*.secured</url-pattern> <url-pattern>/login</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>mobileusers</role-name> </auth-constraint> <!-- <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> --> </security-constraint> <login-config> <auth-method>DIGEST</auth-method> <realm-name>Identity</realm-name> </login-config> <security-role> <description> No Description </description> <role-name>mobileusers</role-name> </security-role>
考虑以下两个Tomcat Realm配置:
配置1-JDBC领域:
在 .../webapps/testapp/META-INF/context.xml
.../webapps/testapp/META-INF/context.xml
<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver" connectionName="mysqluser" connectionPassword="redacted" connectionURL="jdbc:mysql://192.168.1.5/testdb?autoReconnectForPools=true&characterEncoding=UTF-8" digest="MD5" userTable="Users" userNameCol="name" userCredCol="password" userRoleTable="Users" roleNameCol="roleName" />
配置2-数据源领域:
在.../webapps/testapp/META-INF/context.xml:
<Realm className="org.apache.catalina.realm.DataSourceRealm" digest="MD5" userTable="Users" userNameCol="name" userCredCol="password" userRoleTable="Users" roleNameCol="roleName" dataSourceName="jdbc/testDB" />
并在.../conf/context.xml:
.../conf/context.xml
<Resource name="jdbc/testDB" auth="Container" type="javax.sql.DataSource" removeAbandoned="true" removeAbandonedTimeout="15" maxActive="5" maxIdle="5" maxWait="7000" username="mysqluser" password="redacted" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.5/testdb?autoReconnectForPools=true&characterEncoding=UTF-8" factory="com.mycompany.util.configuration.customfactory" validationQuery="SELECT '1';" testOnBorrow="true"/>
由于我不清楚的原因,配置1适用于我们,但配置2不适用于我们。请注意,我们使用代码2中的Context.xml资源在整个地方通过我们的代码连接到MySQL,并且效果很好。但是,当tomcat Realm尝试使用它时,身份验证始终会失败,即使它看起来与Configuration 1一样。
任何人对为什么会这样有任何见解?
假设您的数据源在其他地方(例如Servlet)工作,那么您要做的就是添加localDataSource="true"到Realm派生中,使Realm为:
localDataSource="true"
<Realm className="org.apache.catalina.realm.DataSourceRealm" localDataSource="true" digest="MD5" userTable="Users" userNameCol="name" userCredCol="password" userRoleTable="Users" roleNameCol="roleName" dataSourceName="jdbc/testDB" />
至少,这对我有用。
完美地说,尽管有此参数的名称,也可以100%清除,如果您不想这样做,则无需将数据源放入Webapp的context.xml中。服务器的上下文XML可以正常工作。