本文介紹在Apache中實現用戶身份驗證的方法,討論如何在MySQL資料庫中保存驗證資訊,然後通過mod_auth_mysql模塊實現身份驗證。
一、概述
前文討論了在身份驗證中使用資料庫的方法,具體介紹了mod_auth_db模塊和DB文件的使用。這裡要介紹的是如何使用非常流行的MySQL資料庫保存身份驗證資訊,再通過mod_auth_mysql訪問MySQL資料庫實現身份驗證。
1.1 關於MySQL
MySQL是一種優秀的資料庫服務器,具有體積小速度快的特點。MySQL以GPL方式發行,它的主頁在http://www.mysql.com/。MySQL缺少某些昂貴的大型資料庫所提供的功能,比如存儲過程、觸發子等等,但它具備了大多數中小型工程所需要的基本功能。另外,它還有一些非常實用的特色,比如可用於SQL命令的正則表達式等。
由於MySQL是免費的,而且其表現又如此不俗,在UNIX家族的作業系統上它是很受歡迎的資料庫——特別是對於那些預算有限的用戶來說。另外請注意,MySQL也有在Windows上運行的版本。
1.2 關於mod_auth_mysql模塊
我們可以使用mod_auth_mysql模塊把用戶名字和密碼保存到MySQL資料庫,然後直接使用它們進行身份驗證。
使用這種方法除了能夠提高資料訪問速度之外,還有其他許多好處。例如,假設用戶資訊原來保存在資料庫中,使用文本文件進行密碼驗證時必須把用戶名字和密碼再複製一份,這樣你就得在兩個地方維護同樣的資料,如果這兩份資料不是同步更新,用戶就有可能不能登錄。
反過來,如果使用的是mod_auth_mysql,我們就可以直接用資料庫中的用戶資訊進行身份驗證,此時用戶資訊只需一份就足夠了,用戶名字和密碼可以用SQL命令更新,不會出現使用文本文件時可能遇到的問題。另外,要修改用戶所屬的組也很方便。
二、安裝和配置
要獲得mod_auth_mysql模塊或者查看它的詳細資料,請訪問http://bourbon.netvision.net.il/mod_auth_mysql/。
mod_auth_mysql可以編譯成DSO(Dynamic Shared Object,動態共享對像),然後只需通過配置指令即可將它安裝到服務器上。關於DSO的更多說明,請參見Apache指南:新手安裝必讀。
配置mod_auth_mysql模塊時,我們必須告訴它要用哪一個資料庫來進行身份驗證,以及哪一個表、什麼資料欄包含了驗證用的資訊。下面是配置mod_auth_mysql時必須瞭解的配置指令:
Auth_MySQL_Info [host] [user] [password]
這個指令聲明資料庫在哪一個服務器上運行以及訪問這個資料庫應該使用的用戶名字和密碼。只有當資料庫不在localhost(即本地機器)上運行或者訪問資料庫的不是httpd用戶時,我們才需要使用這個指令。
如果所有的身份驗證操作都使用同一個資料庫,那麼你可以使用下面這個指令:
Auth_MySQL_General_DB [資料庫名字]
否則,如果對不同目錄的身份驗證操作使用不同的資料庫,你可以忽略這個指令,然後在各個的目錄中指定所用資料庫。
下面介紹的幾個指令既可用於httpd.conf配置文件,也可用於各個目錄的.htaccess文件。請參見Using .htaccess Files with Apache瞭解更多資訊。
注意在為目錄設置密碼保護時可以應用通常使用的指令,如下所示:
AuthType Basic
AuthName "Members Only"
require group admin
Auth_MySQL_DB [資料庫名字]:聲明使用哪一個資料庫中的資訊進行身份驗證。
Auth_MySQL_Password_Table [密碼表的名字]:聲明資料庫中哪一個表包含密碼資訊。除非特別聲明,否則默認包含用戶名字的資料欄是「username」,包含密碼的資料欄是「password」。但我們可以按照下面介紹的方法指定另外的資料欄。
Auth_MySQL_Group_Table [保存組資訊的表]:一般地,我們可以把用戶所屬組的資訊(groups資料欄)和用戶名字、密碼保存到同一個表中。但是如果有必要把它保存到獨立的表,這裡可以指定該表的名字。
Auth_MySQL_Username_Field [用戶名字資料欄]:如果保存用戶名字資訊的資料欄不是「username」,可以用這個指令指定實際使用的資料欄名字。
Auth_MySQL_Password_Field [密碼資料欄]:如果保存密碼的資料欄不是「password」,可以用這個指令指定實際使用的資料欄名字。
Auth_MySQL_Group_Field [用戶所屬組的資料欄]:如果保存組資訊的資料欄不是「groups」,可以用這個指令指定實際使用的資料欄名字。
Auth_MySQL_Encrypted_Passwords on/off:告訴mod_auth_mysql模塊保存在資料庫中的密碼是否經過加密。默認on,即假定資料庫中保存的密碼是經過加密的。
還有其他一些指令,不過經常要用到的就是上面這些。下面是.htaccess文件的一個例子:
Auth_MySQL_Info localhost db_user db_password
Auth_MySQL_DB authentication
Auth_Mysql_Password_Table passwords
AuthType Basic
AuthName "Members Only"
require valid-user
上例假定保存用戶名字的資料欄是username,密碼經過加密再保存到password資料欄。
三、其他
只要按照上面介紹的方法設置好了.htaccess文件,訪問該目錄下面的頁面時就會出現密碼輸入窗口。對於用戶來說,不同的密碼保護實現方法並沒有什麼差別。
你可以使用任何自己熟悉的資料庫管理工具管理用戶資訊,目前似乎還沒有象dbmmanage一樣從命令行管理資料庫裡用戶資訊的簡單工具。
但我們可以通過Perl和DBI操作資料庫。下一篇文章要討論的就是用Perl管理密碼文件的諸多優點。用Perl管理密碼的方法實在很多,所以讓它單獨成文應該是比較合適的。
結束語:使用mod_auth_mysql,我們可以把用戶名字、密碼和所屬組資訊保存到MySQL資料庫。MySQL是一種小型、快速、免費的資料庫服務器,大多數流行的作業系統上都有MySQL的相應版本。
create table mysql_auth (
username char(25),
passwd char(25),
groups char(25),
primary key (username)
);
require valid-user
AuthMySQLHost localhost
AuthMySQLDB http_auth
AuthMySQLUser huenlil
#AuthMySQLPassword hughenlil
AuthMySQLUserTable mysql_auth
AuthMySQLNameField username
AuthMySQLPasswordField passwd
#AuthMySQLGroupTable mysql_auth
#AuthMySQLGroupField groups
AuthMySQLCryptedPasswords Off

