Модуль правил не принимает (внешнее) событие «Вход в систему»? - PullRequest
2 голосов
/ 20 октября 2010

В моей установке пользователи входят в систему с помощью Shibboleth [1], но правило [2], которое я настроил для выполнения при событии «Пользователь вошел в систему», не выполняется.

Вкл.с другой стороны, когда я вхожу в систему как администратор обычным способом Drupal, правило выполняется.

Означает ли это, что событие внешнего входа вообще не обрабатывается?

Есть лиспособ преодолеть это?

[1] http://drupal.org/project/shib_auth

[2] http://drupal.org/project/rules

Ответы [ 3 ]

1 голос
/ 21 октября 2010

Кажется, это ошибка модуля Shibboleth , поэтому логин 'event' действительно не вызывается (в терминах Drupal он не вызывает hook_user() с $op = 'login').

Глядя на код Shibboleth , похоже, что вход в систему происходит в его реализации hook_init():

/**
* Create a new user based on informations from the Shibboleth handler if it's necessary or log in.
*/
function shib_auth_init() {
  global $user;

  $unameVar = variable_get('shib_auth_username_variable', 'REMOTE_USER');
  $umailVar = variable_get('shib_auth_username_email', 'HTTP_SHIB_MAIL');

  // If
  // - The user isn't logged in
  // - There is Shibboleth authentication in the background
  // - The settings are fine and there has been a valid username setted up
  // - The settings are fine and there has been a valid user email address setted up
  if (!$user->uid && $_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) {
    if ($_SERVER[$unameVar] && $_SERVER[$umailVar]) {
      user_external_login_register($_SERVER[$unameVar], "shib_auth");
    }
    else {
      drupal_set_message(t("Username or e-mail address is missing. Maybe the Shibboleth configuration is not perfect."),"error");
    }
  }
  if ($user->uid && $_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) {
    $account = user_save($user,array('mail' => $_SERVER[$umailVar]));
    // Terminate if an error occured during user_save().
    if (!$account) {
      drupal_set_message(t("Error saving user account."), 'error');
      return;
    }
    $user = $account;
  }
} // function shib_auth_init()

Так что вам нужно исправить это и убедиться, чтоэто user_module_invoke() называется.Стандартный способ сделать это - позвонить user_authenticate_finalize() после успешного входа в систему (что, в свою очередь, вызовет user_module_invoke()), так что вы добавите это после вызова user_external_login_register():

    [...]
    if ($_SERVER[$unameVar] && $_SERVER[$umailVar]) {
      user_external_login_register($_SERVER[$unameVar], "shib_auth");
      // Do we have a logged in user now?
      if ($user->uid) {
        // Yes, ensure watchdog logging and proper invocation of hook_user
        // NOTE: We pass an empty array, as no form submit was involved here,
        // but we could also pass an array with 'unameVar' and 'umailVar',
        // as they would be the closest substitute.
        user_authenticate_finalize(array());
      }
    }
    [...]

ПРИМЕЧАНИЕ: Непроверенный код, остерегайтесь опечаток и других глупых упущений;)

Если вы в конечном итоге сделаете это, вы можете отправить его в виде патча дляотчет об ошибке, связанный выше.(только если это работает, очевидно;)

0 голосов
/ 21 октября 2010

Drupal запускает hooks, что означает, что у модулей есть шанс запустить кусок кода.Например, при входе в систему вызывается hook_user.

Слишком часто модули будут вызывать drupal_goto() внутри таких хуков.Это сильно сломается.Drupal_goto уничтожит все, отправит заголовок redirect, а затем закроет приложение.Никаких других крючков не будет.

  1. Крючки никогда не должны вызывать drupal_goto (), die () или другие подобные разрушительные функции.Но поскольку ничто не мешает людям нарушать это правило, люди (модули) нарушают его.
  2. form_alter никогда не должен вызывать goto's, умрет и так далее по той же причине.

Вы можете найти любое «незаконное» goto, установив модуль devel и переключив параметр «show redirects», вы увидите, если, например, sibbletooth вызвал перенаправление там, где его не должно быть.

0 голосов
/ 20 октября 2010

Порядок, в котором Drupal загружает модули, очень важен в этих случаях. Вам нужно будет установить правила, чтобы он загружался после вашего модуля аутентификации. Например, с помощью ldap_integration

mysql> UPDATE system SET weight=20 WHERE name="rules";
mysql> UPDATE system SET weight=20 WHERE name="rules_forms";
mysql> UPDATE system SET weight=0 WHERE name="ldapauth";

«20» - это произвольное число, которое больше, чем у вашего модуля аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...