認證
簡介
Dolibarr的身份驗證系統變得相當複雜,如果不熟悉身份驗證流程,就很難找到bug。本頁介紹了認證流程的一部分,允許您遵循流程並在需要時進行干預。您必須熟悉 PHP sessions 才能正確理解發生的事情。
流程
該過程從調用您要查看的頁面開始。例如,htdocs/index.php 主頁。但不是該文件提供身份驗證請求。事實上,Dolibarr中的每個頁面都包含一個 main.inc.php 文件,該文件本身包含 master.inc.php 文件。因此,我們有:
<mypage.php>
<main.inc.php>
<master.inc.php>
#1#
</master.inc.php>
#2#
if (!isset($_SESSION["dol_login"]))
{
// Set goontestloop to true if we are coming from a post of the login page ($_POST["username"] and $_POST["actionlogin"] is defined.
// We may also set goontestloop to true for some other cases depending on the authentication mode (see next chapter)
$goontestloop = ...
if ($goontestloop)
{
checkLoginPassEntity(username, password, ...);
...
// if user and pass are ok, we set $login
$login=
}
if (! $login)
{
// We show login page
include_once(DOL_DOCUMENT_ROOT."/lib/security.lib.php");
dol_loginfunction($langs,$conf,$mysoc);
exit;
}
...
}
</main.inc.php>
#3#
</mypage.php>
#1# 表示加載一大堆我們稍後將使用的庫,並初始化PHP代碼的執行上下文(加載配置文件、加載語言文件並創建一個尚未經過身份驗證的空用戶)。
#2# 表示身份驗證代碼:程序檢查您是否處於已登錄會話中(這意味著 $_SESSION["dol_login"] 存在)。如果不是,則檢查是否從登錄名/密碼錶單接收到傳遞的數據。在第一次調用時,情況並非如此,因為我們還沒有在屏幕上顯示錶單。因此,我們使用 if 判斷,如果 $login 為 false,則顯示登錄的HTML表單,腳本結束。
提交登錄名和密碼後,調用同一個頁面(仍是 index.php),我們還是先進入#1#,然後進入#2#,這次設置了$_POST["username"]。此外,我們還檢查用戶名和密碼是否正確(檢查是在資料庫、LDAP或其他地方進行的,這取決於配置文件中的 $dolibarr_main_authentication 變量值)。如果 login/pass 對正確,則設置 $login 變量,因此我們不會再次顯示錶單,而是繼續並設置 $_SESSION["dol_login"],以便在下一次調用頁面時,我們不再進入「if (! isset($_SESSION["dol_login"]))」。
#3# 對應於檢查業務權限,如果可以,則顯示頁面。有關更多信息,請參閱 用戶權限 頁面。
身份驗證模式和登錄模塊
調用 checkLoginPassEntity 以驗證用戶名/密碼對(或在某些情況下僅驗證用戶),將調用登錄模塊的函數check_user_password_xxx。調用的連接模塊取決於 conf/conf.php 文件中定義的身份驗證模式。
使用的文件名為 htdocs/core/login/functions_xxx.php ,值 xxx 對應於配置文件 conf/conf.php 中 dolibarr_main_authentication 中定義的值。
有關身份驗證模式列表(可能的「xxx」值及其特殊性),請參閱 Authentication,_SSO_and_SSL 。
登錄模塊
登錄模塊是包含檢查用戶/密碼有效性的函數的文件。
一個文件按模塊,一個文件按函數。每個文件都進行不同類型的檢查。
- 文件htdocs/core/login/functions_http.php使用HTTP基本身份驗證檢查用戶/密碼的有效性。
- 文件htdocs/core/login/functions_ldap.php 使用LDAP檢查用戶/密碼的有效性。
- 文件htdocs/core/login/functions_dolibarr.php使用Dolibarr資料庫中數據檢查用戶/密碼的有效性。
每個文件只包含一個名為check_user_password_xxx的函數(xxx為http/ldap/dolobarr),但Dolibarr只使用其中的一個。具體使用哪一個文件,xxx的值與配置文件conf/conf.php中的 dolibarr_main_authentication 的值匹配。
Dolibarr將運行文件包含的唯一函數,方法是將它們作為參數,僅發送從post登錄表單接收的用戶和密碼。如果用戶/密碼有效,函數返回true,否則為false。