2010-10-20 2 views
2

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

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

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

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

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

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

ответ

1

Это, кажется, a bug of the Shibboleth module, поэтому «событие» входа в систему действительно не поднимается им (в терминах Drupal он не вызывает hook_user() с $op = 'login').

Looking at the Shibboleth code, то Логин, кажется, происходит в 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

Порядок, в котором 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» представляет собой произвольное число, которое больше, чем то, что ваш модуль аутентификации.

+0

IMHO, выполнение (или загрузка) порядка здесь не уместно, так как крюк не вызывается вообще! (Приказ будет иметь значение только в том случае, если он захочет отреагировать после реализации одного модуля одним модулем, но в этом случае не на что реагировать в первую очередь) –

0

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^