技術交流

PHP5 與 Apache 集成 Windows AD 帳號認證

由於 Windows AD Server被廣泛應用,為了讓使用者記憶更少的密碼,防止密碼忘記,越來越多企業的應用系統(如 HRMS / ERP / CRM 等)都是基於 Windows AD 來做認證。單點登錄 ( Single Sign-on ) 在企業中的應用越來越普遍。也有很多商業化產品 ( Commercial Products ) 來實現SSO,如 Oracle 的 IAS Server等等。

本文我們主要討論資通電腦的 HR 系統,一個基於 Open Source 的解決方案,雖然沒有商業化產品功能強大,但是也基本實現了類似 SSO 的認證機制。接下來我們就來討論 Windows 2003 Server 上 PHP5、Apache2 如何集成 Windows AD 認證,實現類似 SSO 認證。

基於 Windows AD 認證的原理

某個系統要採用 Windows AD Account 認證時,必須要用當前 Login OS 的 Domain Account 和 eHR 系統使用者表中實際的系統使用者做對應,如果能夠對應到相應的使用者就用此使用者自動 Login,並挑其相關的系統許可權。

這裡沒有看到有關 Password 的驗證,是因為 OS 已經幫我們做了這項工作,所以這裡不需要再驗證密碼了。

Server Side Configure

Apache Server 本身沒有集成 Windows AD 的 Module,必須要載入協力廠商的 Module 才可以實現此功能,這個協力廠商的 Module 名稱是 mod_auth_ssip.so 可以從著名的開源軟體網站 sourceforge.net 上取得,最新版本是 1.0.4。安裝及配置的步驟如下:

  • https://sourceforge.net/projects/mod-auth-sspi 下載解壓
  • Copy mod_auth_ssip.so 到 $APACHE_HOME/modules/ ( $APACHE_HOME 是 apache 安裝的根目錄)
  • 打開 $APACHE_HOME/conf/httpd.conf, 在大約 Line 69  LoadModule asis_module modules/mod_asis.so  的下面加上如下代碼LoadModule sspi_auth_module modules/mod_auth_sspi.so
  • Restart Apache Server.

Client Side Configure
在需要驗證的目錄下新建一個 .htaccess 的 file. File 內容如下:


AuthName "eHR System"
AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
require valid-user
ErrorDocument 401 '<script>alert("Your Account or Password is Error. \r\nClick [OK] button System will redirect to eHR login screen automaticlly.");</script> <meta http-equiv="refresh" content="0;url= ../ess/"/t>'

這是要調用 mod_auth_ssip.so 必須的幾項設定,更多的選項請參考上面解壓目錄裡的 /doc INSTALL.

這個檔裡的內容也可以放在上面的 httpd.conf 檔中,根據你個人的喜好,如果不想改 Server 的配置,或是你沒有許可權更新 Server 的 Config 檔的時候可以採用上面的方式。


// index.php
if (isset ( $_SERVER ["REMOTE_USER"] ) && ! empty ( $_SERVER ["REMOTE_USER"] )) {
session_start ();
header ( "Location: ../ess/includes/login.php?remote_user=" . urlencode ( $_SERVER ["REMOTE_USER"] ) . "&sessid=" . session_id () );
exit ();
} else {
header ( "Location: ../ess/" );
exit ();
} // end if

我們把程式放在需要驗證的根目錄,並命名為 index.php,當運行此目錄時,首先就會調用此程式。

這裡需要說明的是,$_SERVER["REMOTE_USER"] 這個 Supper Global 變數只有在 Apache 在 Load mod_auth_sspi.so 之後才會有。

注意事項

  • 使用 .htaccess 方式時,PHP的 curl 模組一定要打開,在 php.ini 中尋找 ;extension=php_curl.dll 把前面的分號去掉。
  • 選擇合適的 apache 和 mod_auth_sspi.so 版本。
    已知的 Issue mod_auth_sspi.so 1.0.4 + Apache2.x 時,在Server 是 windows XP 或 Windows Server 2003 平臺,IE 下面會無法提交 Post 變數。也就是說通過 mod_auth_sspi 來認證後的其它頁無法進行POST,在 PHP 程式裡無法得到 POST 的變數,所以在使用之前請改在 Get 方式。
  • 問請用主機名稱稱或是功能變數名稱,不要用 IP 來訪問,否則系統每次都 Popup 出輸入 AD 帳號和密碼的 Dialog Window.
  • 打開IE 的Automatic logon with current user and password,Internet Options->Security->Customer Level->User Authentication
    勾選後就第一次會提示輸入 AD Account 和 Password,像 SSO 一樣,之後就會自動 Login .

限於篇幅,具體系統中如何拿 AD Account 和 eHR系統使用者做匹配驗證就不做詳細說明。

Tags:HR 系統
閱讀更多