Это, кажется, 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());
}
}
[...]
ПРИМЕЧАНИЕ: Непроверенные код, остерегайтесь опечаток и других глупых оплошностей;)
Если вы в конце концов это сделаете, вы можете отправить его в качестве исправления в отчет об ошибке, приведенный выше. (только если он работает, очевидно;)
IMHO, выполнение (или загрузка) порядка здесь не уместно, так как крюк не вызывается вообще! (Приказ будет иметь значение только в том случае, если он захочет отреагировать после реализации одного модуля одним модулем, но в этом случае не на что реагировать в первую очередь) –