了解Drupal的会话管理和用户身份验证


16

我有一个要求,我必须用中央服务器(即SSO服务器)的身份验证替换默认的用户身份验证。
通过调试Drupal,我知道所有会话管理都在includes/session.inc文件中进行。我要进行验证,如图所示:

卡

场景:登录
步骤的详细信息将是:

  1. 替换登录表单,以将用户名和密码提交到SSO服务器(不是在Drupal上,而是在.NET上)。
  2. 使用该站点的数据库在SSO服务器上对用户进行身份验证;并将响应发送回我的网站的某个自定义PHP页面(或模块形式的表单?)。
  3. 使用响应,在用户表中标识用户,然后为该用户创建会话,而无需检查密码(因为这将意味着双重身份验证)。默认情况下,Drupal设置cookie的名称为$insecure_session_namevariable,值为value $sid。我希望Drupal不要在此处设置cookie,而是将变量的值发送到SSO服务器。
  4. SSO服务器将获取值,创建一个cookie,然后将其放置在主域中domain.com(以提醒两者,my website并且sso server它们都位于主域的子域中,而在Drupal中也是如此)。然后,Drupal站点可以使用该cookie登录。

我知道这是一个很难回答的问题,我只是在寻找应该如何开始的指针?正如他们所说的“您不应该破解核心”。因此,我的问题是:

  1. 我应该在哪里寻找深度了解Drupal身份验证和会话管理的方式?
  2. 有没有一种方法可以includes/session.inc使用钩子来调用函数(如函数注释中所说的“仅供内部使用/不得修改”)?

注意:我将使用相同的方法注册用户,以便将记录保留在SSO服务器的中央数据库中。在此期间,将在Drupal站点的数据库中为同一用户输入一些垃圾密码(因为登录时不会检查该密码)。


您需要真正的SSO(登录到一个站点并且您已经登录到所有站点),还是仅需要对外部系统进行身份验证?
mpdonadio

@MPD我想要一个真正的SSO,它将需要登录一个站点并->在所有站点上对同一用户进行身份验证(可能不在Drupal上。)
AjitS 2012年

@AjitS如果您已成功实现此功能,请提供详细答案。我正在使用user_login_finalize,但是由于GDPR问题而被告知,我无法在Drupal中存储详细信息。
Jignesh Rawal '18 -10-26

Answers:


17

Drupal支持外部身份验证。Drupal有许多替代的身份验证模块,例如OpenID(包含在核心中),OAuth ConnectorLDAP。了解有关Drupal身份验证如何工作的更多信息;最好的办法是查看OpenID和OAuth模块,并向核心登录表单提交回调。但是,对于AFAIK,他们总是在成功通过身份验证后开始正常的Drupal会话。

对于会话管理,Drupal插入了PHP会话处理并注册了自己的处理程序。Drupal会话后端本身是可插入的,您可以将session_inc变量设置为文件的路径,以提供的功能的替代实现includes/session.inc。该内存缓存模块使用Memcached中存储会话。

作为参考,OpenID模块会处理成功的身份验证,openid_authentication()该身份验证本身将通过调用并登录用户登录表单提交处理程序(即user_login_submit())。该提交处理程序本身很简单,它将成功通过身份验证的用户加载user_load()到全局$user变量中,然后调用user_login_finalize()哪个处理会话,user表中的登录时间戳并调用hook_user_login()实现。

另一个选择是使用user_external_login_register()功能。该功能将登录一个外部用户。如果需要,它还将创建一个本地用户。如果你需要在本地用户创造更多的控制,你可以随时使用user_save()user_set_authmaps()user_login_submit()user_external_load()从你的自定义调用,使用user_external_login_register()为需要做什么模板。


2
这几乎是现场。外部用户登录的Drupal方面非常简单。繁重的工作(如果有的话)实际上是与外部系统的接口。
mpdonadio

@MPD在我的特殊情况下,发现相反的情况。外部系统= JSON Web服务=相对容易的东西。Drupal行为=各个版本之间的变化不可预测-像地狱一样困难,并且在事情中断时没有有用的诊断信息。
Trejkaz 2014年

1

user_authenticate()APi可能会派上用场。

3.使用响应,在用户表中标识用户,然后为该用户创建会话而无需检查密码(因为这意味着需要双重身份验证)。默认情况下,Drupal设置cookie的名称为$insecure_session_namevariable,值为value $sid。我希望Drupal不要在此处设置cookie,而是将变量的值发送到SSO服务器。

编辑:SSO服务器返回true后,使用此API登录用户,该用户将自动为您处理会话。我认为如果您使用user_authenticate()而不是自己创建会话会更好。只要提供有效的p-assowrd,即使是双重身份验证也不会有问题。

不确定4.您是否希望cookie在两个域中都可见?如果是这样,则在settings.php中初始化 $cookie_domain为域。然后,子站点中的cookie将在父站点中可用。


谢谢您的答复。我不能使用,user_authenticate因为不需要在Drupal站点上进行身份验证。我可以通过调用生成会话drupal_session_generate(),并drupal_session_regenerate()从session.inc文件。您对Cookie的要求完全正确..请查看编辑。
AjitS

@indrock检查该链接。如果用户名和密码正确,User_authenticate将允许您登录用户。在第3步中,当您验证SSO服务器上的用户名和密码正确无误后,请使用此API登录用户。但是您应该在Drupal上存储密码。这样做将比黑客核心更容易。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.