1

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が、とにかく正しい解決策がわかりません。

前もって感謝します。

4

1 に答える 1

0

レルムの不適切な展開が問題の原因でした。さらに、ここではカスタム レルムは適切ではありません。IP アドレスを確認する最善の方法は、HTTP 要求にアクセスできるカスタム フォーム オーセンティケーターを作成することです。のフォーム オーセンティケータを変更しweb.xml、それを展開することで、まさに私が必要としていたことが可能になりました。また、安全なリソースは承認の「壁」の背後に隠されているため、すべてのリクエストで IP アドレスをチェックする必要がなくなります。これは、承認が付与された場合、IP が有効であることも意味します。良い解決策を指摘してくれた JoseK に感謝します。Tomcat のレルムの概念に少し戸惑いました。

于 2010-08-28T18:07:03.680 に答える