我为 Tomcat 6 开发了一个 Web 应用程序,但我遇到了一个我不知道如何解决的问题。让我们考虑以下小场景。想象一下,不仅需要通过用户和密码对用户进行身份验证,而且只有在某些额外条件为真(例如,用户、密码和他的 IP 地址匹配)时才会授予身份验证。据我了解,Tomcat 引入了领域的概念。一个简单JDBCRealm
的应用程序就足够了,因为直到现在才检查用户和密码对。现在也需要检查 IP 地址。我编写了一个扩展类的简单测试JDBCRealm
类:
package security;
import org.apache.catalina.realm.JDBCRealm;
import org.apache.log4j.Logger;
import java.security.Principal;
import java.sql.Connection;
public class ApplicationRealm extends JDBCRealm {
protected final Logger logger = Logger.getLogger(this.getClass());
@Override
public synchronized Principal authenticate(Connection connection, String userName, String credentials) {
logger.info("custom realm test, the authentication will be failed just for testing");
return null;
}
}
然后我尝试使用以下方法绑定这个领域类context.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Realm className="security.ApplicationRealm" connectionName="${user}" connectionPassword="${password}"
connectionURL="${url}${database}" debug="99" driverName="${driver}" roleNameCol="role" userCredCol="pw"
userNameCol="login" userRoleTable="users_roles" userTable="users"/>
</Context>
Web应用部署成功,但是当我尝试访问登录页面时,Tomcat返回404页面(我怀疑问题的根源是节点中的className
属性):Realm
HTTP Status 404 -
type Status report
message
description The requested resource () is not available.
Apache Tomcat/6.0.24
如何绑定自定义JDBCRealm
后代context.xml
?也许我尝试使用它是完全错误的JDBCRealm
,但无论如何我都看不到正确的解决方案。
提前致谢。