2010-08-25 26 views
1

Je développe une application web pour Tomcat 6, et je suis confronté à un problème que je ne sais pas résoudre. Considérons le petit scénario suivant. Imaginez qu'il soit nécessaire d'authentifier les utilisateurs non seulement par l'utilisateur et le mot de passe, mais l'authentification n'est accordée que si certaines conditions supplémentaires sont vraies (par exemple, utilisateur, mot de passe et correspondance de son adresse IP). Pour autant que je comprenne, Tomcat a introduit le concept de domaines. Un simple JDBCRealm était suffisant pour l'application, car la paire d'utilisateurs et de mots de passe n'était vérifiée que jusqu'au moment. Maintenant, il est également nécessaire de vérifier l'adresse IP. J'ai écrit une classe de test simple qui étend la classe JDBCRealm:Statut HTTP 404 après avoir déployé une application web avec un domaine personnalisé vers Tomcat 6

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; 
    } 

} 

Et puis je l'ai essayé de lier cette classe de domaine en utilisant la 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> 

Le déploiement de l'application Web réussit, mais lorsque je tente d'accéder à la page de connexion, Tomcat renvoie une page 404 (je soupçonne que la racine du problème est l'attribut className dans le nœud Realm):

HTTP Status 404 -
type Status report
message
description The requested resource() is not available.
Apache Tomcat/6.0.24

Comment puis-je lier une coutume JDBCRealm descendant dans context.xml? Peut-être que je me trompe complètement en essayant d'utiliser le JDBCRealm pour cela, mais je ne peux pas voir la bonne solution de toute façon.

Merci d'avance.

+0

Vérifiez les journaux pour les traces de pile. –

+0

Qu'y a-t-il dans les journaux? (Tomcat/logs) – Bozho

+0

@ Thorbjørn Ravn Andersen, J'ai essayé de vérifier les journaux avant, mais il semble que rien n'est écrit dans le journal. –

Répondre

0

Un déploiement incorrect du domaine était à l'origine du problème. De plus, un domaine personnalisé n'est pas adapté ici. La meilleure façon de vérifier l'adresse IP consiste à écrire un authentificateur de formulaire personnalisé ayant accès à la requête HTTP. Changer l'authentificateur de formulaire dans le web.xml et le déployer permettait exactement ce dont j'avais besoin. Il élimine également l'obligation de vérifier l'adresse IP à chaque requête, car les ressources sécurisées sont cachées derrière le «mur» d'autorisation - cela signifie que si l'autorisation est accordée, cela signifie également que l'adresse IP était valide. Merci à JoseK pour avoir indiqué une bonne solution. J'étais juste un peu confus avec le concept de domaines dans Tomcat.