简介

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.phpdolibarr_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。