運用Apache伺服器的mod_authnz_external模組搭配pwauth驗證程式,即可利用系統上原有的使用者帳號來認證進行網頁控管,而不必透過htpasswd程式來一個一個新增帳號。但如此的做法還是不夠彈性,如果能夠利用資料庫來進行帳號控管就更理想,接下來說明如何利用MySQL資料庫來實作網頁認證。
安裝mod_auth_mysql
在此將以DSO(Dynamic Shared Object)的方式來編譯mod_auth_mysql模組,以下先簡單說明DSO機制。
Apache網站伺服器是一種模組化的系統,可隨意地掛載所需的模組如mod_SSL mod_security等,來增加相關的功能,而其第一種掛載方式是靜態(Static)的模組掛載,例如上述mod_auth認證模組。此種方式必須在編譯原始碼的階段時將所需的模組編譯進來,譬如使用「configure --enable-so」掛載so模組,在編譯階段就會將so模組掛載進來。
另一種較彈性的模組掛載方式為動態掛載模組,有需要時才掛載進來,可利用在httpd.conf設定檔內加上LoadModule的方式來動態載入相關模組。在Apache伺服器上須提供DSO機制,才能夠實現動態掛載模組的功能。Apache伺服器必須在編譯時加上「--enable-so」參數,才可使用DSO機制。可利用指令「httpd -l」檢查是否有支援DSO機制。若出現mod_so.c等字句,即表示有支援DSO機制。
Apache並提供apxs(APache eXtenSion)程式來編譯Apache動態模組。以下說明apxs的使用方法。在此僅說明編譯和安裝的相關選項,其餘選項請自行查閱相關的文件說明。編譯選項如下:
-c:此選項表示執行編譯。將原始碼編譯成動態模組。
-o:指定編譯後的動態模組檔名。
-D name=value:可指定相關的編譯變數。
-I incdir:可用於增加自訂的包含目錄。
-L libdir:可用於增加自訂的程式庫(lib)目錄。
-l libname:可用於增加自訂的程式庫檔案。
-Wc,compiler-flags:可增加編譯器特有的選項。
-Wl,linker-flags:可增加連接器(Linker)特有的選項。
而apxs的安裝選項,則包含以下這幾個項目:
-i :執行安裝,將相關的動態模組安裝至Apache的MODULES目錄中。
-a:自動在httpd.conf加上LoadModule來啟用模組。
-A:自動在httpd.conf加上LoadModule來啟用模組,但會在行首加上#,表示該模組已就緒但尚未啟用。
了解DSO相關的說明後,接著安裝mod_auth_mysql模組,先至下列網址取得最新版本(筆者所取得的版本為3.0):
http://modauthmysql.sourceforge.net/
檔案下載後進行解壓縮,然後以下列指令編譯:
在編譯的過程中會有錯誤訊息產生,這是因為Apache在2.2.11之後的版本,有修改一些MACRO的介面,而mod_auth_mysql 3.0所使用的MACRO為Apache 2.2.11之前的版本。
但在本解決方案中,所使用的Apache版本為2.2.17。在Apache 2.2.17版本中,更改過AP_INIT_FLAG這個MACRO的介面,所以請手動將相關原始碼中有使用AP_INIT_FLAG的第三個參數名稱,由APR_XtOffsetOf更改為APR_APR_OFFSETOF,即可正常的編譯完成。
mod_auth_mysql模組相關參數說明
另外一個更改的地方是,將相關檔案中所有的ap_pstrcat,更改為apr_pstrcat。在編譯成功後,再執行下列指令來安裝相關模組:
在安裝成功後,可在Apache的模組目錄中(本例目錄為「/usr/local/apache/modules/」)發現mod_auth_mysql.so檔案要使用此模組。
在httpd.conf設定檔內加上LoadModule mysql_auth_
module modules/mod_auth_mysql.so,即可啟用mod_auth_mysql模組功能。
接著,說明mod_auth_mysql模組相關設定說明。
以資料庫控管被保護的目錄
首先,先行建立儲存相關帳號密碼的資料庫。在本解決方案中建立一個資料庫名稱為accountDB,認證資料表格(Table)的相關欄位如下:
然後,新增一筆使用者為「TEST」且密碼也為「TEST」的紀錄。在欲保護的目錄下新增.htaccess檔案,其內容如下:
設定完成後,透過瀏覽器連上該網站伺服器,即會彈出一個認證視窗,要求使用者輸入帳號和密碼。輸入完成後,經過帳號及密碼檢查,且使用者的來源IP必須符合ip_address欄位所設定的資訊,方可認證成功。
結語
多年前,當我還是個學生時,教「作業系統」的老師(目前也是開源碼社群很活躍的一個人物)曾說過一句至今仍印象深刻的話:「80/20法則也適用在軟體應用上,軟體越做越大,但使用者所使用的功能卻不到一半,而且大部分的功能,均可用其他的方式取代。」在寫了多年的程式後,筆者也有相當的體驗,只要發揮一點想像力,其實大部分的程式都不必親自一行一行撰寫,大可利用其他相關的套件來組成一個解決方案,例如本解決方案中就是利用Apache的相關模組來完成繁瑣的驗證功能,不必事必躬親一行一行地寫程式。