Сразу скажу, что пока что решил задачу с помощью "костыля", изменил функцию user_hash_password в файле includes/password.inc.
<?php
function user_hash_password($password, $count_log2 = 0) {
if (empty($count_log2)) {
// Use the standard iteration count.
$count_log2 = variable_get('password_count_log2', DRUPAL_HASH_COUNT);
}
return md5($password); //Добавил
//return _password_crypt('sha512', $password, _password_generate_salt($count_log2)); //Было
}
?>
Подскажите, есть ли культурный способ, можно ли, например, как-то переопределить эту функцию в модуле?
Комментарии
зачем?
Зачем в md5 или зачем более культурно?)
В md5 надо для интеграции со сторонним приложением. Пользователь регистрируется в Drupal и получает аккаунт в другом приложении. Надо, чтобы он мог логиниться под тем же логином и паролем. Там пароли хранятся в md5.
А культурно, чтобы после установки модуля не надо было ничего допиливать.
Все это можно сделать и без костылей. Разве нельзя при регистрации пользователя на друпал-сайте передать его данные, включая оригинальный пароль, на стороннее приложение? Перехватить в хуках оригинальный пароль можно (или уже нет?). Проблема безопасности не стоит, т.к. данные передаются внутри сервера.
Уже пробовал перехват оригинального пароля, но к сожалению в модуль пароль приходит уже в виде хеша. В оригинальном виде доступен только старый пароль (при изменении пароля).
Как перехватывали? Через hook_user наверное.
Добавьте свой submit-handler в форму регистрации и в форму редактирования учетной записи примерно вот так:
if ($form_id == 'ENTER CORRECT FORM_ID HERE') {
array_unshift($form['#submit'], 'MY_SUBMIT_CALLBACK_NAME');
}
}
В своем хендлере можете перехватить сырые данные.
Я как-то делал подобную операцию, давно правда. Исходники не сохранились, заглянуть не смогу.
К сожалению в function MODULE_form_user_profile_form_alter(&$form, &$form_state) пароль приходит уже хешированным. В 6-м друпале как я помню в этих обработчиках он действительно был в открытом виде.
А на этапе валидации?
http://my.safaribooksonline.com/book/web-development/drupal/978143022838...
cracker@drupal.org, на этапе валидации тоже хеш. Не проверял, но скорее всего с браузера пароль уже в виде хеша приходит, это было бы логично с точки зрения безопасности.
RxB, спасибо за ссылку, возможность интересная, но это вариант наподобие OpenID. Т.е. надо такую возможность (отдельную форму логина) реализовывать еще и в системе, с которой интегрируется Drupal. К тому же, пользователь, регистрируясь в Drupal, не будет при этом экспортироваться с правильным паролем во внешнюю базу.
Если править стороннюю систему, то интеграцию можно сделать более гладко, но это займет побольше времени... Нет аккуратных вариантов получить md5 пароля в Drupal 7?
Но это вариант для раздумий, а не готовый.
Интересует готовый - могу написать, не бесплатно
Спасибо всем за рекомендации. Сделали в итоге так. user_hash_password менять не стали. Авторизация во внешней базе происходит без повторного ввода логина-пароля, по клику на специальную ссылку в Drupal. Из этой страницы идёт запрос в форму логина во внешнюю систему, которую пришлось тоже слегка доработать для этого.
Вообще password.inc, если требуется можно было и переопределить ядрёными способами, но лучше бы способ с внешней авторизацией.
не надо ничего переопределять и переводить в md5:
<?php
// $password - введённый пароль
// $stored_hash - хеш из базы
function validatePassword($password, $stored_hash) {
include_once $path_to_drupal7_root.'/includes/password.inc';
$hash = _password_crypt('sha512', $password, $stored_hash);
return $stored_hash == $hash;
}
?>