2012-12-05 1 views
4

Pour webapp testapp qui a ce qui suit dans son web.xml (entre autres)Tomcat JDBC vs DataSource Royaume

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

Tenez compte des deux configurations de Realm Tomcat suivantes:

configuration 1 - JDBC royaume:

Dans .../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&amp;characterEncoding=UTF-8" 
     digest="MD5" 
     userTable="Users" 
     userNameCol="name" 
     userCredCol="password" 
     userRoleTable="Users" 
     roleNameCol="roleName" 
/> 

Configuration 2 - DataSource Royaume:

En .../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" 
/> 

Et .../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&amp;characterEncoding=UTF-8" 
    factory="com.mycompany.util.configuration.customfactory" 
    validationQuery="SELECT '1';" 
    testOnBorrow="true"/> 

Pour des raisons que je ne suis pas clair, configuration 1 œuvres pour nous , mais la configuration 2 ne fonctionne pas. Notez que nous utilisons la ressource Context.xml de Configuration 2 pour nous connecter à MySQL dans notre code partout, et cela fonctionne très bien. Lorsqu'un domaine Tomcat Realm tente de l'utiliser, cependant, l'authentification échoue toujours, même s'il semble faire la même chose que la configuration 1.

Quelqu'un a-t-il une idée de ce que cela pourrait être?

+0

Et je viens de réaliser ... est-ce une meilleure question pour serverfault? Je suis un développeur Java, donc je suis habitué à poser des questions ici, mais ... –

+0

J'essaie de répliquer la configuration 1, mais malheureusement je n'ai pas de répertoire META-INF. J'ai utilisé maven jersey-quickstart-archtype pour générer un projet pour moi. Que puis-je faire pour générer le répertoire et context.xml. Ou manuellement où puis-je placer ce répertoire ou créer le fichier moi-même? –

+0

Je ne suis pas sûr. En règle générale, lorsque vous générez un fichier WAR avec Maven et que vous le décompressez, vous disposez d'un répertoire META-INF. Si vous voulez ajouter des éléments à votre projet pour qu'ils soient inclus dans META-INF, typiquement (d'après mon expérience), vous créez le répertoire 'src/main/webapp/META-INF /' et placez ensuite les fichiers. –

Répondre

9

En supposant que vous avez le DataSource travailler ailleurs (en, disons, Servlets), tout ce que vous avez à faire est d'ajouter localDataSource="true" au Royaume decleration tels que le Royaume est:

<Realm className="org.apache.catalina.realm.DataSourceRealm" 
    localDataSource="true" 
    digest="MD5" 
    userTable="Users" 
    userNameCol="name" 
    userCredCol="password" 
    userRoleTable="Users" 
    roleNameCol="roleName" 
    dataSourceName="jdbc/testDB" 
/> 

Au moins, c'est ce que travaillé pour moi.

Pour être parfaitement clair à 100%, malgré le nom de ce paramètre, vous n'avez PAS besoin de placer le DataSource dans le context.xml de Webapp si vous ne le souhaitez pas; le contexte XML du serveur fonctionnera très bien.

+2

Notez que ceci est également une solution pour l'erreur inutile JNDI 'javax.naming .NameNotFoundException: Le nom jdbc n'est pas lié dans ce contexte lors de l'authentification JAAS à l'aide d'un DataSourceRealm. – bzuillsmith