Я разрабатываю веб-приложение для Tomcat 6 и сталкиваюсь с проблемой, которую не знаю, как решить. Давайте рассмотрим следующий небольшой сценарий. Представьте, что требуется аутентифицировать пользователей не только по имени пользователя и паролю, аутентификация предоставляется только в том случае, если выполняются некоторые дополнительные условия (например, пользователь, пароль и его 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>
Развертывание веб-приложения прошло успешно, но когда я пытаюсь получить доступ к странице входа в систему, 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
, но все равно не вижу правильного решения.
Заранее спасибо.