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?
Muchas gracias. Esa fue la solución! Ahora funciona. :-) –
De nada. – BalusC
@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. –