2012-09-08 16 views
5

Me gustaría que los usuarios (que pueden iniciar sesión en mi sitio) se carguen desde una base de datos MySQL. Para hacer eso, quiero configurar un JDBCRealm para mi servidor de aplicaciones Apache Tomcat 7.¿Cómo configurar un JDBCRealm en Apache Tomcat 7?

He leído a través del documentation y he creado una conexión de base de datos utilizando un recurso JNDI (jdbc/foo4). Este recurso funciona (lo uso ya en mi aplicación para recuperar datos). Lo cual no parece funcionar, es la vinculación de un reino con este recurso.

Mi fichero de configuración tiene el siguiente aspecto:

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> 

En mi estándar descriptor de despliegue que entré en el siguiente:

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> 

Y utilicé esta secuencia de comandos SQL para crear un usuario de ejemplo:

security.sql

crear usuarios de mesa (varchar nombre_usuario (15) no es nulo clave principal , varchar user_pass (15) no nulo);

crear user_roles de mesa (varchar nombre_usuario (15) no es nulo,
varchar ROLE_NAME (15) no es nulo, la clave principal (nombre_usuario, ROLE_NAME));

INSERT INTO usuarios (user_name, user_pass) VALUES ('benny', 'test'); INSERT INTO user_roles (user_name, role_name) VALUES ('benny', 'admin');

Pero no puedo iniciar sesión con el usuario "benny" y la contraseña "prueba". Puedo iniciar sesión con el usuario "tomcat" y la contraseña "tomcat" (porque está definida en% CATALINA_HOME% \ conf \ tomcat-users.xml) pero no puedo iniciar sesión con mi propio usuario desde mi base de datos MySQL.

Por supuesto, mi servidor Tomcat está utilizando un controlador MySQL (puse "mysql-connector-java-5.1.9.jar" en% CATALINA_HOME% \ lib).

me sale el siguiente mensaje de error cuando intento iniciar sesión:

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

¿Alguien ve el error?

Respuesta

11

El reino será de forma predeterminada siempre buscar una fuente de datos mundial (configurado en el lado Tomcat en /conf/server.xml), sin embargo usted ha definied una fuente de datos local (configurado en el lado webapp en el mismo /META-INF/context.xml), por lo que el reino no puede encuentra la fuente de datos Debe establecer el atributo localDataSource en true.

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

Véase también el Tomcat 7.0 Realm documentation:

localDataSource

Cuando el reino está anidado dentro de un elemento de contexto, esto esto permite que el reino de utilizar un origen de datos definido por el contexto en lugar de un mundial Fuente de datos. Si no se especifica, el valor predeterminado es false: use un DataSource global.

+0

Muchas gracias. Esa fue la solución! Ahora funciona. :-) –

+0

De nada. – BalusC

+0

@BalusC Esta respuesta no es relevante para mí en este momento, pero usted es el rey de JEE. ¡¡El respeto!! y gracias por todo el trabajo duro. –