首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Apache 整合 MySQL 實現基本身份驗證

     編輯:MySQL 資料庫相關知識

背景

Apache 實現基本用戶身份驗證有多種方式,常見為文字檔和 DBM 格式,但在高負載伺服器上這些都不理想:文字檔基於平面搜尋,效能差且不安全;DBM 稍好但在千萬級用戶時仍力不從心。使用資料庫作為後端儲存是更好方法:比平面搜尋更有效且安全,用戶密碼以 DES 加密形式儲存在資料庫表中。

歸功於 Apache 優秀的模組化結構與開放的 DSO 機制,開發者可編寫第三方模組擴充功能。本文以 MySQL 為後端儲存,原理相同,亦可用 PostgreSQL、Oracle 等對應模組。

安裝 mod_auth_mysql

  1. 從 modules.apache.org 或 ftp://ftp.kcilink.com/pub/ 下載 mod_auth_mysql.c.gz,解壓得 mod_auth_mysql.c。
  2. 用 apxs 產生 DSO 模組(前提是 Apache 採 DSO 模式編譯):
    apxs -c -i -a -L/usr/local/lib/mysql -lmysqlclient -lm mod_auth_mysql.c

    注意:-L/usr/local/lib/mysql 指定 MySQL 客戶端庫位置(假設為預設安裝),若不加此參數啟動 Apache 會報錯無法載入模組。

  3. 檢查 httpd.conf 應包含:
    LoadModule mysql_auth_module libexec/mod_auth_mysql.so
    AddModule mod_auth_mysql.c
    重啟 Apache 應無問題。

建立 MySQL 認證資料表

mysql> CREATE DATABASE auth;
mysql> USE auth;
mysql> CREATE TABLE mysql_auth (
    user_name CHAR(20) NOT NULL,
    user_passwd CHAR(25),
    groups CHAR(25),
    PRIMARY KEY (user_name)
);

注意:欄位名必須為 user_name 和 user_passwd。

插入測試資料(密碼用 ENCRYPT() 函數以 DES 算法加密,與 Unix password 等同,非 MySQL PASSWORD() 函數):

mysql> INSERT INTO mysql_auth VALUES ('xingfei2', ENCRYPT('abcde'), 'xingfei');
mysql> INSERT INTO mysql_auth VALUES ('xingfei', ENCRYPT('abcde'), 'xingfei');

配置 .htaccess 保護目錄

在要保護的目錄建立 .htaccess(確保 AllowOverride All 已開啟):

AuthName "xingfei"
AuthType Basic
AuthMySQLHost localhost
AuthMySQLUser root
AuthMySQLPassword abc
AuthMySQLDB auth
AuthMySQLUserTable mysql_auth
AuthMySQLGroupField groups
Require group xingfei
Require user xingfei

可將用戶放在同一群組,只要是該群組用戶即可通過驗證,也可 Require 單一或多個用戶。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved