
En un post anterior, explico cómo configurar el acceso a un directorio usando la utilería htpasswd el cual funciona para pocos usuarios ya que debe hacerse manualmente por cada uno. La autenticación por base de datos ofrece una configuación más flexible, menos laboriosa e ideal para ambientes donde la cantidad de usuarios es elevada.
Para este ejercicio usaré una base de datos Oracle 11g(11.1.0.7.0) el cual está soportado de acuerdo con la documentación de Apache que viene en el archivo [APACHE_HOME]\README-win32.txt. Es necesario tener instalado el cliente de Oracle y configurar adecuadamente una cadena de conexión(tnsnames) como la de la siguiente imagen

abre una sesión de sqlplus
crea un usuario
asígnale los correspondientes privilegios
conéctate con el usuario apache, crea la tabla e inserta un registro que servirá para las pruebas de conexión
Actualiza tu archivo de configuración de Apache [APACHE_HOME]\conf\httpd.conf para activar las siguientes líneas
y al final agrega lo siguiente. No olvides crear el directorio C:\Apache22\htdocs\private
Levanta Apache, pero hazlo desde línea de comandos ya que si lo haces desde la consola no apreciarías algún mensaje de error que pudiera ocurrir.
si no se muestra ningún mensaje de error no está de más revisar el archivo [APACHE_HOME]\logs\error.log
Y finalmente hacer la prueba de conexión desde un navegador


Resolviendo problemas
P: Aparece el siguiente mensaje cuando trato de levantar Apache:
R: No has activado en tu archivo [APACHE_HOME]\conf\httpd.conf la línea
P: Aparece el siguiente mensaje cuando trato de levantar Apache:
R: No has activado en tu archivo [APACHE_HOME]\conf\httpd.conf la línea
P: Ya levantó Apache pero no se conecta con la base de datos, reviso el archivo [APACHE_HOME]\logs\error.log y aparece el siguiente error
R: El mensaje de error es genérico y sólo te informa lo que sucedió sin ninguna pista de la causa, es aquí donde donde debes revisar lo que hiciste desde el principio para determinar qué sucede y cómo solucionarlo.
P: El navegador me pide el usuario y la contraseña pero después de escribirlos me aparece el mensaje de error "Internal Server Error"
R: Revisa tu archivo [APACHE_HOME]\logs\error.log en busca de detalles específicos. Te puedes encontrar, por ejemplo, con que el query que especificaste en el parámetro AuthDBDUserPWQuery no está correcto
Referencia
http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html
Para este ejercicio usaré una base de datos Oracle 11g(11.1.0.7.0) el cual está soportado de acuerdo con la documentación de Apache que viene en el archivo [APACHE_HOME]\README-win32.txt. Es necesario tener instalado el cliente de Oracle y configurar adecuadamente una cadena de conexión(tnsnames) como la de la siguiente imagen

abre una sesión de sqlplus
C:\>sqlplus sys as sysdba
SQL*Plus: Release 11.1.0.7.0 - Production on Sun Jun 21 23:17:37 2009
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
SQL*Plus: Release 11.1.0.7.0 - Production on Sun Jun 21 23:17:37 2009
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
crea un usuario
SQL> create user apache identified by test account unlock;
User created
User created
asígnale los correspondientes privilegios
SQL> grant create session to apache;
Grant succeeded.
SQL> grant resource to apache;
Grant succeeded.
Grant succeeded.
SQL> grant resource to apache;
Grant succeeded.
conéctate con el usuario apache, crea la tabla e inserta un registro que servirá para las pruebas de conexión
SQL> conn apache/test
Connected.
SQL> create table users (
2 username varchar2(10 byte),
3 passwd varchar2(10 byte)
4 );
Table created.
SQL> insert into users(username, passwd) values ('sergio', 'test');
1 row created.
SQL> commit;
Commit complete.
Connected.
SQL> create table users (
2 username varchar2(10 byte),
3 passwd varchar2(10 byte)
4 );
Table created.
SQL> insert into users(username, passwd) values ('sergio', 'test');
1 row created.
SQL> commit;
Commit complete.
Actualiza tu archivo de configuración de Apache [APACHE_HOME]\conf\httpd.conf para activar las siguientes líneas
LoadModule authn_dbd_module modules/mod_authn_dbd.so
LoadModule dbd_module modules/mod_dbd.so
LoadModule dbd_module modules/mod_dbd.so
y al final agrega lo siguiente. No olvides crear el directorio C:\Apache22\htdocs\private
# mod_dbd configuration
DBDriver oracle
DBDParams "host=testserver port=1521 user=apache pass=test dbname=testdb"
DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300
<Directory "C:/Apache22/htdocs/private">
# core authentication and mod_auth_basic configuration
# for mod_authn_dbd
AuthType Basic
AuthName "Private directory"
AuthBasicProvider dbd
# core authorization configuration
Require valid-user
# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery "SELECT passwd FROM users WHERE username = %s"
</Directory>
DBDriver oracle
DBDParams "host=testserver port=1521 user=apache pass=test dbname=testdb"
DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300
<Directory "C:/Apache22/htdocs/private">
# core authentication and mod_auth_basic configuration
# for mod_authn_dbd
AuthType Basic
AuthName "Private directory"
AuthBasicProvider dbd
# core authorization configuration
Require valid-user
# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery "SELECT passwd FROM users WHERE username = %s"
</Directory>
Levanta Apache, pero hazlo desde línea de comandos ya que si lo haces desde la consola no apreciarías algún mensaje de error que pudiera ocurrir.
C:\Apache22\bin>httpd -k start
si no se muestra ningún mensaje de error no está de más revisar el archivo [APACHE_HOME]\logs\error.log
Y finalmente hacer la prueba de conexión desde un navegador


Resolviendo problemas
P: Aparece el siguiente mensaje cuando trato de levantar Apache:
C:\Apache22\bin>httpd -k start
Syntax error on line 485 of C:/Apache22/conf/httpd.conf:
Invalid command 'DBDriver', perhaps misspelled or defined by a module not included in the server configuration
Syntax error on line 485 of C:/Apache22/conf/httpd.conf:
Invalid command 'DBDriver', perhaps misspelled or defined by a module not included in the server configuration
R: No has activado en tu archivo [APACHE_HOME]\conf\httpd.conf la línea
LoadModule dbd_module modules/mod_dbd.so
P: Aparece el siguiente mensaje cuando trato de levantar Apache:
C:\Apache22\bin>httpd -k start
Syntax error on line 498 of C:/Apache22/conf/httpd.conf:
Unknown Authn provider: dbd
Syntax error on line 498 of C:/Apache22/conf/httpd.conf:
Unknown Authn provider: dbd
R: No has activado en tu archivo [APACHE_HOME]\conf\httpd.conf la línea
LoadModule authn_dbd_module modules/mod_authn_dbd.so
P: Ya levantó Apache pero no se conecta con la base de datos, reviso el archivo [APACHE_HOME]\logs\error.log y aparece el siguiente error
(20014)Internal error: DBD: Can't connect to oracle
(20014)Internal error: DBD: failed to initialise
(20014)Internal error: DBD: failed to initialise
R: El mensaje de error es genérico y sólo te informa lo que sucedió sin ninguna pista de la causa, es aquí donde donde debes revisar lo que hiciste desde el principio para determinar qué sucede y cómo solucionarlo.
- Revisa el archivo [APACHE_HOME]\README-win32.txt y verifica que la versión del motor de base de datos que estás usando está soportada por la versión de Apache que instalaste.
- Revisa que los parámetros en DBDParams estén correctos. A este respecto, la documentación de Apache no es la correcta en cuanto a los de Oracle ya que especificaOraclesin embargo, especificamente "server" no lo reconoce como válido y por lo tanto es necesario usar "host" y "port" en su lugar.
user, pass, dbname, server
P: El navegador me pide el usuario y la contraseña pero después de escribirlos me aparece el mensaje de error "Internal Server Error"
R: Revisa tu archivo [APACHE_HOME]\logs\error.log en busca de detalles específicos. Te puedes encontrar, por ejemplo, con que el query que especificaste en el parámetro AuthDBDUserPWQuery no está correcto
(20014)Internal error: DBD: failed to prepare SQL statements: ORA-00904: "USER_NAME": invalid identifier
(20014)Internal error: DBD: failed to initialise
(20014)Internal error: DBD: failed to initialise
Referencia
http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html
