lunes 22 de junio de 2009

Autenticación por base de datos en Apache 2.2.x usando mod_dbd, mod_authn_dbd y mod_auth_user en Windows 2003 Server

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

crea un usuario
SQL> create user apache identified by test account unlock;

User created

asígnale los correspondientes privilegios
SQL> grant create session to apache;

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.

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

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>

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

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

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

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.
  1. 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.
  2. 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 especifica

    Oracle
    user, pass, dbname, server
    sin embargo, especificamente "server" no lo reconoce como válido y por lo tanto es necesario usar "host" y "port" en su lugar.


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


Referencia
http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html