2012-09-08 9 views
5

Mi piacerebbe che gli utenti (che sono autorizzati ad accedere al mio sito) siano caricati da un database MySQL. Per farlo voglio configurare un JDBCRealm per il mio server applicazioni Apache Tomcat 7.Come impostare un JDBCRealm in Apache Tomcat 7?

Ho letto lo documentation e ho creato una connessione al database utilizzando una risorsa JNDI (jdbc/foo4). Questa risorsa funziona (lo uso già nella mia applicazione per recuperare i dati). Il che non sembra funzionare, è il collegamento di un reame con questa risorsa.

mio file di configurazione si presenta così:

src \ Main \ webapp \ META-INF \ context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Context antiJARLocking="true" path="/my-webapp"> 
    <!-- works! --> 
    <Resource name="jdbc/foo4" 
      type="javax.sql.DataSource" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/foo4" 
      username="root" 
      password="root" 
      maxActive="8" 
      maxIdle="4" 
      maxWait="10000" 
      auth="Container" 
      /> 
    <!-- Does not seem to work?! --> 
    <Realm className="org.apache.catalina.realm.DataSourceRealm" 
     dataSourceName="jdbc/foo4" 
     userTable="users" 
     userNameCol="user_name" 
     userCredCol="user_pass" 
     userRoleTable="user_roles" 
     roleNameCol="role_name"/> 
</Context> 

Nel mio standard descrittore di distribuzione sono entrato il seguente:

src \ main \ webapp \ WEB-INF \ web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <security-constraint> 
    <display-name>General Restriction</display-name> 
    <web-resource-collection> 
     <web-resource-name>Entire Application</web-resource-name> 
     <description>All resources in this application are protected.</description> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>admin</role-name> 
    </auth-constraint> 
    </security-constraint> 
    <login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>Administration Area</realm-name> 
    <form-login-config> 
     <form-login-page>/login.jsp</form-login-page> 
     <form-error-page>/error.jsp</form-error-page> 
    </form-login-config> 
    </login-config> 
    <security-role> 
    <role-name>admin</role-name> 
    </security-role> 
    <resource-ref> 
    <res-ref-name>jdbc/foo4</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    </resource-ref> 
</web-app> 

E ho usato questo script SQL per creare un utente di esempio:

security.sql

creare utenti della tabella (nome_utente varchar (15) NOT NULL chiave primaria , user_pass varchar (15) non nullo);

creare user_roles tavola (nome_utente varchar (15) non nulli,
role_name varchar (15) non nullo, chiave primaria (nome_utente, role_name));

INSERISCI NEGLI UTENTI (user_name, user_pass) VALUES ('benny', 'test'); INSERISCI INTO user_roles (user_name, role_name) VALUES ('benny', 'admin');

Ma non riesco ad accedere con l'utente "benny" e la password "test". Posso accedere con l'utente "tomcat" e la password "tomcat" (perché è definito in% CATALINA_HOME% \ conf \ tomcat-users.xml) ma non riesco ad accedere con il mio utente dal mio database MySQL.

Ovviamente, il mio server Tomcat utilizza un driver MySQL (ho inserito "mysql-connector-java-5.1.9.jar" in% CATALINA_HOME% \ lib).

ottengo il seguente messaggio di errore quando si tenta di accedere a:

Sep 08, 2012 7:38:55 PM org.apache.catalina.realm.DataSourceRealm open 
Exception performing authentication 
javax.naming.NameNotFoundException: Name [jdbc/foo4] is not bound in this Context. Unable to find [jdbc]. 

Qualcuno vede l'errore?

risposta

11

Il regno sarà di default sempre alla ricerca di un'origine dati globale (configurato in parte Tomcat in /conf/server.xml), però hai definied un'origine dati locale (configurato nel lato webapp nella stessa /META-INF/context.xml), in modo che il regno non può trova l'origine dati È necessario impostare l'attributo localDataSource su true.

<Realm ... localDataSource="true" /> 

Vedi anche il Tomcat 7.0 Realm documentation:

localDataSource

Quando il regno è annidato all'interno di un elemento di contesto, questo permette il regno di utilizzare un DataSource definito per il contesto piuttosto che a livello globale Fonte di dati. Se non specificato, il valore predefinito è false: utilizzare un DataSource globale.

+0

Grazie mille. Questa era la soluzione! Ora funziona. :-) –

+0

Prego. – BalusC

+0

@BalusC Questa risposta non è rilevante per me al momento ma tu sei il re di JEE. Rispetto!! e grazie per tutto il duro lavoro. –